Java开发中更多常见的危险信号

在《 Java开发中的常见危险信号》一文中,我研究了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题。 这些“红色标记”类似于“代码气味”的概念,我在这篇文章中引用的某些特定“红色标记”被称为“代码气味”。 正如我在第一篇文章中所述,这些“红色标志”中的几个被认为足够重要,以至于静态代码分析工具和Java IDE会对其进行标记。

直接“记录”消息到stdout或stderr

日志记录框架已经在Java中使用了很长时间,如今,我们拥有各种各样的日志记录框架 (其中一些框架是相互构建的),包括传统的Log4j 1.2 , log4j 2 , java.util.logging ( Java Logging API ), Apache Commons Logging和SLF4J 。 鉴于此,当我在Java代码中看到System.out和System.err引用时,我感到很惊讶。

有许多原因直接引起人们关注是否存在直接写入标准输出或标准错误的Java代码。 引起关注的一个原因是,这可能意味着不成熟的代码,该代码原本打算在以后更改为日志记录,但却没有得到最终的关注。 引用标准输出和标准错误的另一个缺点是,“已记录”消息可能不会出现在日志文件中,而其余日志则由日志框架编写。 第三个问题是,日志记录框架提供了许多不错的功能,而简单地写入标准输出和标准错误并没有提供这些功能。 这些功能包括轻松控制所记录消息的级别的能力,在指定的记录级别下控制是否通过性能降低来生成大型输出字符串的功能,轻松将捕获的异常与已记录的错误消息相关联的功能,并且能够轻松地将输出重定向到不同的目的地和格式。 尽管所有这些都可以在直接处理输出和错误流时手动完成,但它需要自定义工作,而不是“开箱即用”。

除了使用System.outSystem.err直接访问外,Java代码中还存在一些写入标准输出和标准错误的表现形式(尽管它们通常隐式包含System.outSystem.err )。 例如, Throwable.printStackTrace() [更常用于Exception的处理],正如其Javadoc所言:“将此throwable及其回溯打印到标准错误流中。”

使用StringBuffer而不是StringBuilder

这诚然是一个很小的事情,但它可以指示过时的 Java代码( StringBuffer的推出在JDK 1.0和StringBuilder的介绍在J2SE 5 )或Java代码在开发商没有明白之间的差别的StringBuffer和StringBuilder的 。 在大多数情况下,两者之间的性能差异对于手头的应用程序并不重要,但是由于StringBuilder在大多数我使用StringBuffer的 情况下更可取 ,因此人们也可能会享受使用StringBuilder通常带来的轻微性能优势。 我有困难的时候,回顾一个实例中,我所看到StringBuffer使用其中StringBuilder不可能被替代。 一个相关的危险信号是在其构造函数或重载的append方法中将String串联与StringBuilder混合 。

方法和构造函数中的参数过多

当方法或构造函数的参数过多时,尤其是在多个参数具有相同类型的情况下,我总是担心其客户端无法正确使用该方法或构造函数。 例如,如果一个方法接受三个String和三个boolean ,则客户端很容易混淆传入的特定值。在这种情况下,编译器无济于事,这是检测问题根源的唯一方法(甚至根本不存在问题)在运行时(通过单元测试或其他测试,或者可悲的是,在软件的常规执行过程中)。 对于不正确的设计,太多的参数也可能成为“危险信号”。 我不会在本文中更深入地讨论这个“红色标志”,因为我已经介绍了这个“红色标志”,多种解决方法,并在一系列八篇博客文章中介绍了它。

  • Java方法中的参数太多,第1部分:自定义类型
  • Java方法中的参数太多,第2部分:参数对象
  • Java方法中的参数太多,第3部分:构建器模式
  • Java方法中的参数太多,第4部分:重载
  • Java方法中的参数太多,第5部分:方法命名
  • Java方法中的参数太多,第6部分:方法返回
  • Java方法中的参数太多,第7部分:可变状态
  • Java方法中的参数太多,第8部分:工具

过多的显式投射

显式转换可能是危险信号情况的最佳示例之一,在该情况下,转换本身可能不会影响正常工作的任何功能或逻辑,但是提示情况不尽如人意。 强制转换可能意味着较差的设计选择(例如,未正确使用多态性,在不适当的情况下使用继承,或迫使从未设计过的东西放在一起)。 在许多情况下(例如,在获取Spring Framework上下文bean时),显式强制转换当然是适当的或必需的,但是显式强制转换也可以用作拐杖,以使未经过精心设计的工作正常进行。 强制转换还可以指示过于宽泛的API或过于宽泛的API中使用的接口(在下一项中突出显示)。

接口或类的使用范围太广

当Set或List或更具体的接口更合适时,我经常看到Collection接口用作方法参数或返回类型。 例如,一个返回Collection但希望客户端代码知道返回的Collection是有序的方法,应该返回List或更具体的接口或List实现。 同样,如果某个方法需要一个有序的Set ,则它应该将该方法宣传为希望有SortedSet或类似的接口或实现类。 对于给定的合同,当返回或期望作为参数的接口或类太宽泛时,有人被迫“知道”这种情况,并强制转换为适当的级别以获取他们所依赖的功能。

使用适当的级别或接口或类不仅可以避免不必要的显式转换。 适当的类型级别比单纯的文档可以更好地宣传和执行方法合同。 但是,它远不止于此。 在某些情况下,当公告的接口太宽而无法捕获方法协定中的假设时,可能会发生重大的运行时异常。 例如,一个通用接口可以选择支持一个方法,但是该接口的实际实现在被调用时会抛出UnsupportedOperationException ,因为它没有实现该可选方法。 在UnsupportedOperationException和ClassCastException之间,使用过宽的接口或类可能会导致潜在的严重运行时问题。

这并不是说应该避免使用接口或广泛的类。 而是说,应该在返回类型和参数类型中使用适当的抽象度,以便适当地宣告和强制执行调用双方的预期行为。

使用List.addAll()

使用重载的List.addAll()方法之一会让我感到紧张,当我在代码中看到它时,它会亮红色。 这并不意味着使用它总是错误的,但是似乎由于滥用它,我似乎已经看到了很多肿的内存问题。 因为List会添加开发人员喜欢的“重复”对象,所以错误的代码可以用冗余对象以指数方式填充这些List 。 此范围的负面影响从潜在的性能障碍到内存不足。 当我看到使用List.addAll() ,我会仔细检查代码并对其进行单元测试,以确保其内存消耗不会失控。 如前面的“红色标记”中所述,必须对Collection.addAll()任何使用进行类似于List.addAll()分析,直到可以肯定地知道Collection实际上不是List为止。

非Java方言

也许对我而言,最好的例子是“危险信号”,这是与“普遍接受的Java编码标准 ”相反或有明显不同的惯用语和代码约定的频繁使用。 使用名称,大小写或其他样式问题都不会直接影响代码的正确性或性能。 但是,这些差异仍然是“危险信号”,警告逻辑或性能方面的潜在实际问题,因为使用这些严重的非标准习语和约定意味着开发人员可能是Java的新手,因此可能犯了一些新的错误。 Java。 关于“不带重音”编写Java代码的重要性的好文章是讲不带重音的Java语言 。 在该文章中,作者Elliotte Rusty Harold撰写了有关如何更难以阅读和维护此类代码的文章。

在相对罕见的情况下,这可能会从样式问题变为影响问题。 当人们以一种在另一种语言(例如C或C ++)中最有意义的方式编写Java代码,但没有Java的替代方法那样有意义时,就会发生这种情况。

结论

就像我在第一篇有关Java代码中的红色标志的文章中一样,本文中讨论的“红色标志”通常是指在适当和特定的情况下使用时不一定正确的事物,但通常确实表明事物不那么正确因为它们可能会在更大的应用程序中使用。

参考:来自JCG合作伙伴 Dustin Marx的Java开发中的更多常见 危险信号 , 来自Inspired by Actual Events博客。

翻译自: https://www.javacodegeeks.com/2013/12/more-common-red-flags-in-java-development.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python平均分由高到低顺序排列输出选手编号和最后得分_python 字典的使用案例二:求平均分,并按平均分由高到低输出选手编号和最后得分...

校园好声音大赛,三位选手得分,由8位评委给出。请根据评分表,将每们选手的得分去掉一个最高分和一个最低分后求平均分,并按照平均分由高到低输出选手编号和最后得分。dicScores {012: [90, 94, 97, 86, 85, 89, 88, 85], 005: [91…

java开发 职业技能_java编程开发程序员需要具备哪些职业技能

随着互联网的不断发展,java编程开发可以说是目前学习人数和应用范围非常多的一种编程语言了,而今天我们就一起来了解一下,java编程开发程序员需要具备哪些职业技能。1、数据结构和算法分析数据结构和算法分析,对于一名程序员来说&…

Django model转字典的几种方法

平常的开发过程中不免遇到需要把model转成字典的需求,尤其是现在流行前后端分离架构,Json格式几乎成了前后端之间数据交换的标准,这种model转dict的需求就更多了,本文介绍几种日常使用的方法以供参考,所有例子均基于Dj…

微信小程序日历课表

最近项目中使用到了日历&#xff0c;在网上找了一些参考&#xff0c;自己改改,先看效果图 wxml <view class"date"><image class"direction" src"/images/icon/left.png" bindtapminusMouth/><label>{{year}}年{{mouth}}月<…

Java:将条件移至消息文件

Java类ResourceBundle和MessageFormat提供了一个很好的工具集&#xff0c;用于解决Java应用程序内部的本地化消息。 这篇文章提供了一个小示例&#xff0c;说明如何使用ChoiceFormat将与消息相关的简单条件从Java代码移动到消息文件中。 如果您已经知道ChoiceFormat我认为您不会…

【LuoguP3241】[HNOI2015] 开店

题目链接 题意 给出一棵边带权的树&#xff0c;多次在线询问一个点到一个区间内的点的距离和。 Sol 分块过不了的 一个 trick &#xff0c;都知道要算两点之间距离可以拆成到根的距离和他们的 LCA 到根的距离 &#xff0c;其实要算多个点到一个点距离也可以使用一个类似的 tric…

windows中的项目拷贝到linux中,部分数据不显示的原因

linux严格区分大小写&#xff0c;可能是数据表名大小写导致的。 如上传文件不成功&#xff0c;可能是系统权限导致的。转载于:https://www.cnblogs.com/miaoxingren/p/9784743.html

java并发数据共享机制_Java并发编程:核心理论之数据共享性

原标题&#xff1a;Java并发编程&#xff1a;核心理论之数据共享性并发编程是Java程序员最重要的技能之一&#xff0c;也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解&#xff0c;同时要求编程者逻辑清晰、思维缜密&#xff0c;这样才能写出高效、…

调用天气预报接口

方案一&#xff1a; 浏览器由于安全的限制&#xff0c;不允许跨域访问。但是PHP服务器是允许的。我们可以通过使用PHP文件做代理&#xff0c;通过PHP来调用接口。 详细接口分析可参看&#xff1a;http://www.cnblogs.com/wangjingblogs/p/3192953.html 返回JSON格式 PHP代码…

测试集准确率不变_这个医疗AI准确率突破天际,招来了铺天盖地的质疑

转自 | 量子位只要输入一次心跳的波谱。就能判断一个人有没有发生心力衰竭 (CHF) &#xff0c;准确率100%。这是英国华威大学领衔的团队&#xff0c;用机器学习方法做出的新成果。还登上了影响因子2.943的Biomedical Signal Processing and Control期刊。准确率眼看就要突破天际…

JavaFX自定义控件– Nest Thermostat第1部分

几周前&#xff0c;由于Hendrik Ebbers的出色文章 &#xff0c;我决定花一些时间观看有关JavaFX的JavaOne讨论。 我不得不说我已经学到了很多东西&#xff0c;只是看这些视频&#xff08;即使我还没有完成&#xff09;&#xff01; Gerrit的“使用力&#xff0c;路克”或使用J…

PHP涉及的所有英文单词

PHP涉及的所有英文单词拦路虎 PHP再火&#xff0c;也会让一部同学心生畏惧&#xff0c;因为看到编辑器中那一串串英文单词&#xff0c;担心自己英文不好&#xff0c;从而对能学会PHP的决心产生动摇。其实大可不必&#xff0c;英文在学习PHP过程中真的连级别都够不上&#xff0c…

java 不编译咋办_java – 为什么JVM不编译整个程序,而不是逐个编译?

他所说的是,在运行时将所有字节码编译成机器语言是不切实际的.您可以预先编译所有内容,但这并不是JIT所采用的方法.一方面,不知道程序有多大.人们在30分钟的启动时会相当不高兴,因为它编译了可以找到的每个库(给定的Java程序不在一个文件中,它可以访问类路径中的所有内容)对于另…

mysql .pdb是什么文件_计算广告算法到底要做什么?

这个话题在这个专栏开篇就该去讲。恰逢今天公司业务和财务培训(20190216)之后&#xff0c;也有一些思索&#xff0c;索性就都汇总写下来。本文杂述&#xff0c;不尽完备&#xff0c;但是值得不断完善。我喜欢一句话“革命不是请客吃饭&#xff0c;不是做文章&#xff0c;不是绘…

浅析inline-block--使用inline-block创建布局

inline-block前端程序猿们肯定不陌生&#xff0c;它是display属性的一个取值。 之所以称之为inline-block。是因为它兼具行内元素(inline-element)和块级元素(block-element)的特征。 块级元素&#xff08;block elements&#xff09;,来源于CSS盒子模型。块级元素包含width h…

Cookie和Session版的登录验证

URL : from django.conf.urls import url from app01 import viewsurlpatterns [url(r^login/, views.login),url(r^home/, views.home),url(r^index/, views.index), ] 前端 : <form action"" method"post">{% csrf_token %}<input type"t…

Java 8 Friday Goodies:java.io终于成功了!

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个新的博客系列了…

ASP.NET获取客户端、服务器端基础信息

1. 在ASP.NET中专用属性&#xff1a;获取服务器电脑名&#xff1a;Page.Server.ManchineName获取用户信息&#xff1a;Page.User获取客户端电脑名&#xff1a;Page.Request.UserHostName获取客户端电脑IP&#xff1a;Page.Request.UserHostAddress2. 在网络编程中的通用方法&am…

java json decode 中文_关于json_decode乱码及NULL的解决方法

写接口的同学应该会经常遇到数据格式的转换&#xff0c;这时候必不可少的两个函数就是json_encode()和json_decode()。这两个函数使用的时候有很多的主要事项&#xff0c;在这里我来说一下json_decode()。json_decode():对JSON 格式的字符串进行解码,接受一个JSON 格式的字符串…

syslog可能引起得问题_牙齿经常有问题?可能是这4个坏习惯引起的,要改正

很多人明明很年轻&#xff0c;却得了很多牙齿疾病&#xff0c;甚至到了换牙的地步。牙齿虽然是最为坚硬的身体器官&#xff0c;但是即使再坚硬也是容易受到伤害的&#xff0c;日常生活中有很多小事都会造成对牙齿的伤害&#xff0c;想要保护牙齿&#xff0c;一定要改正一下这几…