java 代码风格_Java代码风格:最终决定
java 代码风格
所谓的最不起眼的事情如何引发争议性的讨论,有时甚至引起激烈的辩论,难道不是很有趣吗? 例如,我目睹了几次场合,如何使用关键字final
引发了非常激烈的争论。 对于外部观察者来说,这看起来似乎是对邪恶或神圣的最终决定decision可危。
但是,必须公平地说,大多数可能的final
用例都很难适应简单的对或错模式。 使用还是不使用的选择取决于经常相互矛盾的意图的个人强调。
在文学中寻求建议时,唯一的中途共识似乎是最终常数定义…
class Foo {public static final String CONSTANT = "constantValue";
}
…以及约书亚·布洛赫(Joshua Bloch)的第15项:最小化可变性1 ,他建议将不可变类的所有字段都定型为final
并确保不能扩展该类(而后者不必通过final
强制实现):
public final class Foo {private final int value;public Foo( int value) {this.value = value;}public int getValue() {return value;}[...]
}
从那里意见分歧。 小罗伯特·西蒙斯 在他的《 Hardcore Java 2》一书中,整整一章都专门介绍了final
关键字,他在结尾给出了强烈的建议,即“将final遍及整个代码”。 这个写得很好的章节包含许多关于通过声明变量,参数,方法或类final
将逻辑错误转换为编译时错误的优点的见解。
另一方面,罗伯特·C·马丁(Robert C. Martin)明确不同意以下陈述:“有一些对final
良好用法,例如偶尔的final
常量,但否则关键字几乎没有增加任何价值并造成很多混乱” 3 。 他继续说, final
可能会遇到的错误类型通常会在他的单元测试中涵盖。
虽然我倾向于同意马丁,但我不会说席梦思通常是错的。 过去,我实际上经常自己使用final
关键字,以避免编程错误或滥用。 但是,改变主意的一个原因可能是几年前我转向了TDD方法。
这样一来,除了Martin的论点,我注意到,如果将协作者类或其某些方法声明为final
,则通过协作者模拟实现测试隔离将变得更加棘手。 由于很难将测试视为滥用 ,这使我想到了此类声明可能暗示的深远影响。 我意识到,很难预见到将没有有效的用例,这将证明扩展和覆盖是合理的。
相反,面对final
方法或类,人们有时会颇具创造力,以某种方式规避了限制,这使事情可能比例如类扩展本来就糟。 因此,如今,我通常避免在类和方法声明上使用关键字,而将自己局限于文档中不希望出现的子类注释或类似内容。
在本文结束之前,我想就上述混乱的话题分享最后的想法。 为此,请查看以下代码,该代码依赖final
来确定方法范围的变量和参数:
public void doit( final String message ) {final int value = calculate();final Item item = create( value, message );executorService.submit( new Runnable() {public void run() {handle( item );}} );}
尽管代码没有多大用处,并且可以按不同的方式排列,但是对于最近偶然遇到的final
代码 ,它反映了某种真正的编码风格 。 尽管这种样式可以防止在发生意外时重新分配局部变量,但它也掩盖了一个事实,即final
声明实际上是强制性的。 这是因为在匿名Runnable
实现中使用了变量item
。 下一个代码段摆脱了不必要的声明以强调不同之处:
public void doit( String message ) {int value = calculate();final Item item = create( value, message );executorService.submit( new Runnable() {public void run() {handle( item );}} );}
权衡利弊我更喜欢最后一个变体,但我假设根据您个人的观点,IDE的功能是在发出警告时退出本地重新协助,团队的编码约定以及,而且,而且,您可能有充分的理由选择第一种或第二种样式,甚至更倾向于选择两者的混合。
这使我得出最终结论,即争议将继续!
- 有效的Java(第二版),第4章–类和接口,Joshua Bloch,2008年, ↩
- 顽固的Java,第2章-最后的故事,小罗伯特·西蒙斯,2004年, ↩
- 干净的代码,第16章,重构SerialDate,罗伯特·C·马丁,2009年↩
翻译自: https://www.javacodegeeks.com/2014/04/java-code-style-the-final-decision.html
java 代码风格
java 代码风格_Java代码风格:最终决定相关推荐
- java 代码重用_Java 代码重用:功能与上下文重用
我几乎不需要讨论为什么重用代码是有利的.代码重用通常使得程序开发更加快速,并使得 BUG 减少.一旦一段代码被封装和重用,那么只需要检查很少的一段代码即可确保程序的正确性.如果在整个应用程序中只需要在 ...
- java 执行顺序_Java代码执行顺序
程序中代码执行的顺序非常重要,稍有不慎便会是程序运行出错,那么我将结合实例来分析代码中的执行. 名词解释 首先了解几个名词: 非静态代码块 直接由 { } 包起来的代码,称为非静态代码块 静态代码块 ...
- java语音验证码_Java代码示例_Java语音验证接口 | 微米-中国领先的短信彩信接口平台服务商...
Java语音验证接口代码示例 请求 import java.util.HashMap; import java.util.Map; public class IvrDemo { /** * 语音验证接 ...
- java 代码注释_Java代码注释
通过代码注释,可提高程序的可读性.注释中包含了程序的信息,可以帮助从程序员更好的阅读和理解程序.Java源文件的任意位置都可以添加注释语句.注释的文字Java编译器不进行编译,所有代码中的注释文字对程 ...
- java输出日志_java代码中如何正确使用loggger日志输出
java代码中如何正确使用loggger日志输出 发布时间:2019-06-28作者:spider阅读(2980) 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统, ...
- java integer 不变模式_Java代码的变与不变
哲学上说变与不变,讲的是绝对运动与相对静止的道理,在代码设计中,也有许多变和不变之间的辩证故事. 有一些类在创建以后,整个生命周期内都不会发生变化,这种模式被称为Immutable Pattern. ...
- java引用变量_java代码声明引用变量经验
1.static只能修饰类的成员变量,不能修饰方法里的局部变量. 因为static是在类加载时候将成员变量存储进方法区的. 加载类的时候,是不去执行方法里的函数的.所以不会馆方法里的代码,自然就不会读 ...
- java外部接口图解_java代码实现访问网络外部接口并获取数据的工具类详解
java代码实现访问网络外部接口并获取数据的工具类 工具类代码,可以直接copy使用 package com.yqzj.util; import org.apache.log4j.LogManager ...
- java基本要点_java代码的基本要点
java代码的基本要点 Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程.以下是小编为大家搜索整理的java代码的基本要点,希望能给大家带 ...
最新文章
- RAID类型及软RAID的组建
- python使用符号 表示单行注释-Pyhton中单行和多行注释的使用方法及规范
- java百度云推送demo_百度云推送java服务端maven安装完整demo
- 全球及中国电动自行车零件和配件行业运营状况及未来发展趋势预测报告2022年版
- js浏览器窗口大小改变时事件
- C#6.0中$的用法
- 运行wordcount.java_运行hadoop wordcount程序
- python实现守护进程_守护进程原理及Python实现
- tp摄像头的默认地址_tp-link怎么设置无线桥接 tp-link设置无线桥接方法【图文】...
- hadoop安装详细步骤_LED透明屏安装步骤详细说明
- 解决办法:对BZ2_bzDecompressInit/BZ2_bzDecompress/BZ2_bzDecompressEnd未定义的引用
- OpenCV Python 直方图
- mpg文件怎么转换成mp4
- java日历数据_JAVA 常用数据类型 之日历类
- 如何在Java中以编程方式阅读,添加或删除PPT中的幻灯片便笺?
- python实现数字规律_从学习python总结语言规律
- java 基础库_Java基础类库
- 一篇文章让你从JAVA零基础入门`OOP`编程12.19
- 小牛采购管理系统 v3.01 bt
- idea 新手创建Spring项目