java安装_Java开发中更多常见的危险信号
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.out
和System.err
直接访问外,Java代码中还存在一些写入标准输出和标准错误的表现形式(尽管它们通常隐式包含System.out
和System.err
)。 例如, Throwable.printStackTrace() [更常用于Exception的处理],正如其Javadoc所述:“将此throwable及其回溯打印到标准错误流中。”
使用StringBuffer而不是StringBuilder
这诚然是一个很小的事情,但它可以指示过时的Java代码( StringBuffer的推出在JDK 1.0和StringBuilder的介绍在J2SE 5 )或Java代码在开发商没有明白之间的差别的StringBuffer和StringBuilder的。 在大多数情况下,两者之间的性能差异对于手头的应用程序并不重要,但是由于在我见过使用StringBuffer的大多数情况下, StringBuilder是更可取的,因此使用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()方法之一会让我感到紧张,当我在代码中看到它时,它会变成一个鲜红色的标志。 这并不意味着使用它总是错误的,但是似乎由于滥用它,我似乎已经看到了很多of肿的内存问题。 因为List
会添加开发人员喜欢的“重复”对象,所以错误的代码可以用冗余对象以指数方式填充这些List
。 此范围的负面影响从潜在的性能障碍到内存不足。 当我看到使用List.addAll()
,我会仔细检查代码并对其进行单元测试,以确保其内存消耗不会失控。 如前面的“红色标记”中所述,必须对Collection.addAll()
任何使用进行类似于List.addAll()
分析,直到可以肯定地知道Collection
实际上不是List
为止。
非Java方言
也许对我而言,最好的例子是“危险信号”,这是与“普遍接受的Java编码标准”相反或明显不同的惯用语和代码约定的频繁使用。 使用名称,大小写或其他样式问题都不会直接影响代码的正确性或性能。 但是,这些差异仍然是“危险信号”,警告逻辑或性能方面的潜在实际问题,因为使用这些明显的非标准习语和约定意味着开发人员可能是Java的新手,因此可能犯了一些新的错误。 Java。 关于“不加任何重音”编写Java代码的重要性的好文章是讲不带任何重音的Java语言。 在该文章中,作者Elliotte Rusty Harold撰写了有关如何更难以阅读和维护此类代码的文章。
在相对罕见的情况下,这可能会从样式问题变为影响问题。 当人们以一种不同语言(例如C或C ++)中最有意义的方式编写Java代码,但没有Java的替代方法那样有意义时,就会发生这种情况。
结论
就像我第一篇关于Java代码中的红旗的文章一样,这篇文章中讨论的“红旗”通常是指在适当和特定的情况下使用时不一定正确的事物,但通常确实表明事物并不那么正确。因为它们可能会在更大的应用程序中使用。
翻译自: https://www.javacodegeeks.com/2013/12/more-common-red-flags-in-java-development.html
java安装
java安装_Java开发中更多常见的危险信号相关推荐
- Java开发中更多常见的危险信号
在< Java开发中的常见危险信号>一文中,我研究了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题. 这些"红色标记"类似于"代码气味&q ...
- java 绑定微信号开发_Java开发中的常见危险信号
java 绑定微信号开发 在开发,阅读,复审和维护成千上万行Java代码的几年中,我已经习惯于看到Java代码中的某些" 危险信号 ",这些信号通常(但可能并非总是)暗示着代码有问 ...
- java 项目 预警_java开发中的常见代码黄线预警
java日常开发中,经常会碰到开发工具idea.Eclipse等在一些代码中报黄线,这对于很多具有强迫症的同学来说,也是一件很头疼的事,尤其是编码不注意规范的同学来说. 下面我就列举一些常见的黄线预警 ...
- SearchHit转成java对象_Java开发中最常犯的10个错误,你中招了吗?
http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/ 阅读目录 Array转ArrayList 判断一个数 ...
- java 绑定微信号开发_Java开发中的更多常见危险信号
java 绑定微信号开发 在< Java开发中的常见危险信号>一文中,我研究了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题. 这些"红色标记"类似 ...
- Java开发中的常见危险信号
在开发,阅读,复审和维护成千上万行Java代码的几年中,我已经习惯于看到Java代码中的某些" 危险信号 ",这些信号通常(但可能并非总是)暗示着代码问题. 我不是在谈论总是错误的 ...
- Java开发中常见的危险信号(中)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- Java开发中常见的危险信号
Dustin Marx是一位专业软件开发者,从业已经有17年的时间,他拥有电子工程学士学位,还是一位MBA.Dustin维护着一个博客,专门介绍软件开发的各个主题.近日,他撰文谈到了Java开发中常见 ...
- java静态引用_Java开发中静态方法引用和实例方法引用案例详细讲解
Java开发 前言 在Java的日常开发中静态方法引用和实例方法引用在很多地方都会用到,可以说是万金油,但是你真的掌握了吗?下面就由小编给大家做一个比较细想的讲解,废话不多说现在开始把. 正文 大家对 ...
最新文章
- Arduino初初教程3 ——交通灯
- Zookeeper集群搭建伪分布式
- java异常 子类_Java异常 Exception类及其子类(实例讲解)
- iis 不是 php,iis是不是默认支持php
- C++:C++在图片特定区域之外产生随机数
- 苹果电脑基本设置+Linux 命令+Android 实战集锦
- 组合枚举——妖梦拼木棒(洛谷 P3799)
- 为什么打完篮球后手接触篮球杆会有触电感?
- cacti安装后修改说明
- line vty 0 4 和line vty 5 15 区别
- 总数量超过五十个,史上最全的爬虫项目集合
- c语言设计数字增量pi控制器,PI控制器的工作原理是什么?
- Springboot 发邮件端口问题
- 小米无线键盘的连接方式
- 微信小程序-预研总结(PPT分享)
- 长短信实现系列之电信SMGP3.0
- word文件打开就是只读模式,怎么取消?
- SpringBoot接口实现视频在线播放
- List 常用的 Lambda 操作
- CodeBlocks安装汉化与使用说明