Java代码风格:最终决定

所谓的最不起眼的事情如何导致争议性的讨论,有时甚至导致激烈的辩论激烈,这不是很有趣吗? 例如,我目睹了几次场合,如何使用关键字final引发了非常激烈的争论。 对于一个外部观察者来说,这看起来似乎是对邪恶或神圣的最终决定stake可危。

但是,必须公平地说,大多数可能的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方法。

通过这样做,除马丁的论点之外,我注意到,如果将协作者类或其某些方法声明为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的功能是通过警告退出本地重新协助的能力,团队的编码约定以及,而且,而且,您可能会有充分的理由选择第一种或第二种样式,甚至更倾向于选择两者的混合。

这使我得出最终结论,那就是争论将继续下去!

  1. 有效的Java(第二版),第4章–类和接口,Joshua Bloch,2008年, ↩
  2. 顽固的Java,第2章-最后的故事,小罗伯特·西蒙斯,2004年, ↩
  3. 干净的代码,第16章,重构SerialDate,罗伯特·C·马丁,2009年↩

翻译自: https://www.javacodegeeks.com/2014/04/java-code-style-the-final-decision.html

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

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

相关文章

有感软件安装称呼的变化

上学的时候,揣着一盒磁盘到处跑“拷贝”新软件(现在我还有几张5寸低密和高密盘作纪念)。这盒磁盘也成了我的工具箱,用的时候拷上,不用的时候“删除”,COPY、DEL以及DELTREE是我经常用到的命令。从来不用担心…

手机端调试console.log,直接引入一个js文件

http://files.cnblogs.com/files/lwwen/mConsole.js 这是我写的一个原生js文件 直接引入即可&#xff0c;可以把html上面的需要打印的东西打印出来 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"Viewport"…

独木舟贪心算法c语言,算法:(贪心算法)-独木舟问题

独木舟上的旅行Description进行一次独木舟的旅行活动&#xff0c;独木舟可以在港口租到&#xff0c;并且之间没有区别。一条独木舟最多只能乘坐两个人&#xff0c;且乘客的总重量不能超过独木舟的最大承载量。我们要尽量减少这次活动中的花销&#xff0c;所以要找出可以安置所有…

2019.01.01 bzoj3625:小朋友和二叉树(生成函数+多项式求逆+多项式开方)

传送门codeforces传送门codeforces传送门codeforces传送门 生成函数好题。 卡场差评至今未过 题意简述&#xff1a;nnn个点的二叉树&#xff0c;每个点的权值KaTeX parse error: Expected EOF, got \inC at position 4: v_i\̲i̲n̲C̲\{a_1,a_2,...a…&#xff0c;定义一棵树…

Python 全局变量

报错信息&#xff1a;UnboundLocalError: local variable referenced before assignment 在函数内部修改全局变量时报错。 因为&#xff1a;在python里&#xff0c;如果在函数内部试图去修改一个全局变量&#xff0c;那么实际上的操作是 Python会创建一个新的名字一模一样的局部…

斑能不能彻底去掉_用茶树精油祛痘时,千万不能做这5件事!!!

祛痘注意事项~用茶树精油祛痘时&#xff0c;千万不能做这5件事&#xff01;&#xff01;&#xff01;长痘痘虽然是令人很头疼的事&#xff0c;但是茶树精油祛痘、去痘印功效可谓是无敌的&#xff01;茶树精油是自然界中的抗菌大师&#xff0c;能净化皮肤、平衡皮肤油脂分泌&…

JAX-RS 2.0:自定义内容处理

我试图想到一个更好的标题&#xff0c;但未能拿出一个&#xff01; 请多多包涵……。 JAX-RS 2.0规范允许我们无缝地将JAXB对象编组到HTTP请求/响应主体/从HTTP请求/响应主体中解组。 简而言之&#xff0c;我们可以使用域对象&#xff0c;而不必担心基于JAX-RS的解决方案中的低…

这个夏天,感动我的歌,感动我的你

七里香 词&#xff1a;方文山 曲&#xff1a;周杰伦 JAY 窗外的麻雀 在电线杆上多嘴你说这一句 很有夏天的感觉手中的铅笔 在纸上来来回回我用几行字形容你是我的谁 秋刀鱼的滋味 猫跟你都想了解初恋的香味就这样被我们寻回那温暖的阳光 像刚摘的鲜艳草莓你说你…

构造函数模式

function student(props){this.nameprops.name || 匿名;//默认是匿名this.gradeprops.grade || 1;}student.prototype.hellofunction(){console.log(hello this.name);}function createStudent(props){return new student(props||{})}var xiaomingcreateStudent({name:xiaomin…

android 获取应用内存大小,如何在Android中获取当前内存使用量?

这取决于您要获得的内存查询的定义。通常&#xff0c;您想知道堆内存的状态&#xff0c;因为如果它占用了太多内存&#xff0c;您就会得到OOM并使应用程序崩溃。为此&#xff0c;您可以检查下一个值&#xff1a;final Runtime runtime Runtime.getRuntime();final long usedMe…

Waymo在美国推出自动驾驶汽车共享服务

导读经过数月的测试和数百万英里的无人驾驶汽车技术开发&#xff0c;Waymo 正式在美国推出了具有商业性质的自动驾驶汽车的共享服务。该公司的 Waymo One 项目将为客户提供 24 小时自动驾驶汽车服务。最初&#xff0c;这项服务将仅限于菲尼克斯周边城市&#xff0c;包括坦佩 (T…

2019春第一次课程设计实验报告

一、实验项目名称&#xff1a; 飞机游戏简化的编写 二、实验项目功能描述&#xff1a; 这个实验主要是实现游戏的正常运行&#xff0c;实现控制飞机的移动功能&#xff0c;增加其实用度&#xff0c; 同时还实现发射子弹和出现敌机的操作&#xff0c;利用函数封装重构飞机游戏&a…

区别和联系_动机与主题的区别与联系

今天我算是彻底弄明白了动机与主题的区别与联系&#xff08;暴论&#xff09;。当前些天我开始尝试写简单的奏鸣曲时&#xff0c;主题是什么&#xff0c;这个问题卡住了我&#xff0c;因为之前写的练习曲都是基于简单动机的。所以我求助于维基百科。主题是什么&#xff1f;参考…

Java 8中的新BigInteger方法

对JDK 8中的新功能的关注理所当然地主要集中在新的语言功能和语法上。 但是&#xff0c;对库和API进行了一些不错的添加&#xff0c;在本文中&#xff0c;我介绍了BigInteger类中添加的四个新方法&#xff1a; longValueExact&#xff08;&#xff09; &#xff0c; intValueEx…

巴顿又吃回头草

巴顿是一名好车手&#xff0c;一个会给shumi以及kimi造成威胁的家伙&#xff0c;我并不在意他在哪个车队&#xff0c;只希望他跑得比kimi慢才好。from新浪&#xff1a;宛如平地一声雷&#xff0c;巴顿重返威廉姆斯的消息不仅让车迷感到错愕&#xff0c;英美车队的老板理查兹更是…

打印发现function toUpperCase() { [native code] }

var shello undefined s.toUpperCase function toUpperCase() { [native code] } s.toUpperCase() "HELLO" 咦 然后我就发现了 要是这本来是一个方法 然后你没有用一个方法的方式去调用&#xff0c;就会出现function toUpperCase() { [native code] } 类似于这一句 …

android 静态方法 构造方法,android基础-Java篇02:类和对象、构造方法、访问权限控制、重载、this关键字、static关键字...

一、类和构造方法(类和对象在百度百科已经有详细的介绍&#xff0c;这里只做简单的描述以及帮助理解&#xff1b;百度百科&#xff1a;类和对象&#xff0c;需要注意的是&#xff0c;百度百科类和对象的举例中都是C&#xff0c;书写格式不要和Java混淆&#xff01;)什么是类&am…

『003』Shell命令

『001』索引-Linux Shell Command shell命令 《01》【线上查询及帮助】【001】-【001】 【001】- 点我快速打开文章【man】【help】【已改版】《02》【文件及目录操作】【002】-【008】 【002】- 点我快速打开文章【ls】【cd】【已改版】【003】- 点我快速打开文章【cp】【find…

尝试将WCF映射到Java术语

通过写这篇文章&#xff0c;我冒着被.NET和Java社区拒绝的巨大风险。 试图解释Java术语WCF &#xff08;代表Windows Communication Foundation&#xff09;是什么。 从WCF到Java的映射并不是很简单。 我缺乏对WFC使用者应该了解的与服务通信类型的了解&#xff1a;请求/响应或…

bootbox.js

bootbox:一个弹出框插件&#xff0c;官网看一下例子就好了&#xff1a;http://bootboxjs.com/examples.html 目前来说应该只要调用bootbox.js就可以了&#xff0c;没有css的问题 1.有最基本的调用就是 bootbox.alert("This is the default alert!"); 就什么都不做&…