关于总决赛

可以将变量声明为final。 最终变量只能分配一次。 如果分配了最终变量,则将导致编译时错误,除非在分配前立即将其绝对取消分配。

分配任何最终变量后,将永远无法对其进行更改。 如果变量引用任何对象的任何实例,它将继续引用相同的对象实例,但是可以修改对象的内部状态。

有效地最终

且仅当且仅当变量才可以被视为有效的最终变量

  1. 它不是最终的
  2. 分配发生一次

我发现有效地解释final的最简单方法是想象将final修饰符添加到变量声明中。 如果通过此更改,程序在编译时和运行时都继续以相同的方式运行,则该变量实际上是最终变量。

在Lamda表达式中使用

使用但未在lambda表达式中声明的任何局部变量,形式参数或异常参数必须声明为final或有效地为final,否则在尝试使用时会发生编译时错误。

将局部变量捕获限制为有效的不变变量的目的是使开发人员将注意力转移到更容易并行化的,自然线程安全的技术上。 如果管理不当,可变字段始终是潜在的并发问题来源。 禁止通过lambda表达式捕获字段将降低实用性,而无需执行任何操作。

最终关键字的使用

根据我的观点,最好在适当的时候将局部变量,方法参数,字段变量标记为final。 它警告其他开发人员不要意外修改值。 除此之外,它还向编译器发出信号以优化类文件。 有很多反对此说法的说法,即在源文件中使用final关键字不能优化类文件是不正确的。 我强烈建议您看一下Robert Simons Jr编写的Hardcore Java ,其中详细介绍了final关键字的使用及其优化。

我觉得使用final关键字会使任何开发人员都清楚代码的意图。 将变量设为final可以减轻程序员的负担,使他们可以遍历代码以查看变量在初始化后是否已更改。 就在多线程环境中维护状态而言,它也比非最终变量安全得多。

根据RustyX在StackOverflow 线程中提供的详细基准测试,以下程序演示了明显的性能提升:

public class FinalTest {public static final int N_ITERATIONS = 10_00_000;public static String testFinal() {final String a = "a";final String b = "b";return a + b;}public static String testNonFinal() {String a = "a";String b = "b";return a + b;}public static void main(String[] args) {long tStart, tElapsed;tStart = System.currentTimeMillis();for (int i = 0; i < N_ITERATIONS; i++)testFinal();tElapsed = System.currentTimeMillis() - tStart;System.out.println("Method with finals took " + tElapsed + " ms");tStart = System.currentTimeMillis();for (int i = 0; i < N_ITERATIONS; i++)testNonFinal();tElapsed = System.currentTimeMillis() - tStart;System.out.println("Method without finals took " + tElapsed + " ms");}}

结果非常出色:

Method with finals took 5 ms
Method without finals took 273 ms

我个人也更倾向于使用不可变的类,并使用final关键字作为实例变量来表明这一点。 根据有效Java的 Joshua Bloch的说法,

不可变的类比可变的类更容易设计,实现和使用。 它们不易出错,并且更安全。。此外,不可变对象可以恰好处于一种状态,即创建该对象的状态。 vs可变对象可以具有任意复杂的状态空间。

静态代码分析工具

适当时,像PMD这样的静态分析工具是使用final关键字的最大支持者之一。 有关更多信息,请查看此 。 如果缺少final关键字,则将FindBugs和CheckStyle配置为对变量发出警告。 我发现此链接支持在Checkstyle中使用final关键字:

在执行该方法的算法期间更改参数的值可能会造成混淆,应该避免。 让Java编译器阻止这种编码样式的一种好方法是将参数声明为final。

Eclipse保存动作

Eclipse IDE提供了有用的“ 保存操作首选项”页面 ,该页面使您可以应用主要侧重于优化源代码的更改。 保存操作之一是在适当的情况下将最终关键字应用于变量。

结论

在清晰的设计和可读性方面,我支持在源文件中使用final关键字,而我的其他Java开发人员中很少有人因为它带来的视觉混乱而与我不同意。 我同意,在局部变量,实例变量,方法参数,构造函数参数,catch子句中使用final关键字似乎可以增加视觉混乱和冗长。 但是,如果有什么可以帮助任何未来的开发人员或维护人员更快,更可靠,更有效地执行其工作的,我们应该加以利用。

但是,当然,这全都是个人喜好;-)我很想听听您对此的看法。

翻译自: https://www.javacodegeeks.com/2017/07/all-about-finals.html

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

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

相关文章

java中void_关于java中void的用法?

阿波罗的战车void除了说明该方法没有返回值外&#xff0c;还有什么作用呢&#xff1f;构造方法同样也是没有返回值的&#xff0c;那它和void方法有什么区别呢&#xff1f;构造方法与方法又有什么区别&#xff1f;用具象的实物来表现的话三者有何种关系呢&#xff1f;id 除了说明…

卷积神经网络mnist手写数字识别代码_搭建经典LeNet5 CNN卷积神经网络对Mnist手写数字数据识别实例与注释讲解,准确率达到97%...

LeNet-5卷积神经网络是最经典的卷积网络之一&#xff0c;这篇文章就在LeNet-5的基础上加入了一些tensorflow的有趣函数&#xff0c;对LeNet-5做了改动&#xff0c;也是对一些tf函数的实例化笔记吧。环境 Pycharm2019Python3.7.6tensorflow 2.0 话不多说&#xff0c;先放完整源码…

glassfish_多种监视和管理GlassFish 3的方法

glassfishGlassFish 3支持多种监视和管理方法。 在本文中&#xff0c;我将简要介绍GlassFish提供的管理&#xff0c;监视和管理方法。 GlassFish管理控制台 GlassFish基于Web的管理控制台GUI可能是GlassFish管理最著名的界面。 默认情况下&#xff0c;运行GlassFish后&#xf…

java 阻塞锁_Java实现锁、公平锁、读写锁、信号量、阻塞队列、线程池等常用并发工具...

锁的实现锁的实现其实很简单&#xff0c;主要使用Java中synchronized关键字。public class Lock {private volatile boolean isLocked false;private Thread lockingThread null;public synchronized void lock() throws InterruptedExpection {while(isLocked){wait();}isLo…

flask-mail异步发送邮件_SpringBoot 2.0 集成 JavaMail ,实现异步发送邮件

一、JavaMail的核心API1、API功能图解2、API说明(1)、Message 类:javax.mail.Message 类是创建和解析邮件的一个抽象类子类javax.mail.internet.MimeMessage &#xff1a;表示一份电子邮件。 发送邮件时&#xff0c;首先创建出封装了邮件数据的 Message 对象&#xff0c; 然后把…

Java 9中什么是私有的?

在进行面试时&#xff0c;我发现大多数应聘者都不知道Java中的private修饰符真正意味着什么。 他们知道一些足以进行日常编码的事情&#xff0c;但还远远不够。 这不成问题。 足够了解就足够了。 但是&#xff0c;了解Java的一些内部工作仍然很有趣。 在极少数情况下&#xff0…

python国际象棋ai程序_用Python编写一个国际象棋AI程序

最近我用Python做了一个国际象棋程序并把代码发布在Github上了。这个代码不到1000行&#xff0c;大概20%用来实现AI。在这篇文章中我会介绍这个AI如何工作&#xff0c;每一个部分做什么&#xff0c;它为什么能那样工作起来。你可以直接通读本文&#xff0c;或者去下载代码&…

java switch case怎么判断范围_【转】Java期末复习攻略!

期末19年就这样要过去了&#xff0c;终于到了小时候作文里的未来呢&#xff01;然而&#xff0c;期末考试也随之来临了。不知大家“预习”的怎么样呢&#xff1f; 期末复习资料的放送快接近尾声了下面康康学长学姐们怎么教你们打java这个boss(下面是java大佬给大家的复习建议以…

java list 去重复元素_java List去掉重复元素的几种方式

使用LinkedHashSet删除arraylist中的重复数据(有序)List words Arrays.asList("a","b","b","c","c","d");HashSet setnew LinkedHashSet<>(words);for(String word:set){System.out.println(word);}使用Has…

spring aop示例_Spring JpaRepository示例(内存中)

spring aop示例这篇文章描述了一个使用内存中HSQL数据库的简单Spring JpaRepository示例。 该代码示例可从GitHub的Spring-JpaRepository目录中获得。 它基于带有注释的Spring-MVC-示例和此处提供的信息 。 JPA资料库 在此示例中&#xff0c;我们实现了一个虚拟bean&#xff1…

python人工智能入门优达视频_机器学习:优达教你搭建Python 环境的正确姿势

原标题&#xff1a;机器学习:优达教你搭建Python 环境的正确姿势为机器学习搭建好 Python 环境听起来简单&#xff0c;但有时候坑还不少。如果此前没有配置过类似的环境&#xff0c;很可能会苦苦折腾各种命令好几个小时。可是我明明只是想马上搞起来我的机器学习&#xff01; 在…

java web登录状态保持_java web用于保持状态的4种方法

方法一&#xff1a;网址重写通过在url地址后面添加若干的token作为查询字符串来实现。token的值一般为 键值url?key1value1&key2value2&...&keynvaluenurl与token之间需要用?分开&#xff0c;两个token之间则是需要用一个&符号隔开。此方法适用于token不需要…

python天天向上续2_2019/2/12 Python今日收获

Python day12——025&#xff0c;026字典&#xff1a;当索引不好用时 1.字典&#xff1a;python唯一的一个映射类型。用键值对存储数据&#xff0c;他的标志是大括号。一个键值组合叫一个项。键的类型既可以是字符串类型也可以是整形也可以是浮点型。 如&#xff1a;dict{1:one…

python生成矩阵_如何在Python中生成矩阵?

你的问题的答案取决于你的学习目标是什么。如果您试图让矩阵“点击”以便以后使用它们&#xff0c;我建议您查看一个Numpyarray&#xff0c;而不是一个列表列表。这将使您可以轻松地分割行、列和子集。只要试着从列表中获取一个列&#xff0c;你就会感到沮丧。 使用列表列表作为…

java ee cdi_Java EE CDI ConversationScoped示例

java ee cdi在本教程中&#xff0c;我们将向您展示如何在Web应用程序中创建和使用ConversationScoped Bean。 在CDI中&#xff0c;bean是定义应用程序状态和/或逻辑的上下文对象的源。 如果容器可以根据CDI规范中定义的生命周期上下文模型来管理其实例的生命周期&#xff0c;则…

js input 自动换行_深入Slate.js - 拯救 ContentEditble

我们是钉钉的文档协同团队&#xff0c;我们在做一些很有意义的事情&#xff0c;其中之一就是自研的文字编辑器。为了把自研文字编辑器做好&#xff0c;我们调研了开源社区各种优秀编辑器&#xff0c;Slate.js 是其中之一&#xff08;实际上&#xff0c;自研文字编辑器前&#x…

java main 如何不退出_为什么java main主线程退出了子线程还能运行;golang main结束所有协程都被结束了...

最近看golang main函数结束&#xff0c;所有协程都被结束了结论是这样&#xff1a;A不是main程的情况下&#xff0c;在A程里开启B程&#xff0c;A程执行完&#xff0c;A程return之后&#xff0c;B程不受影响&#xff0c;不会挂掉。所有子协程与main程同级的&#xff0c;与main程…

安全点

安全点 Java应用程序中有两个逻辑线程组&#xff1a; 应用程序线程执行应用程序逻辑 执行GC的线程 在执行诸如堆压缩之类的操作时&#xff0c;GC线程会四处移动一些对象&#xff0c;并且这些对象不能被任何应用程序线程使用&#xff0c;因为它们的物理位置可能会发生变化。 …

printf 地址_C程序显示主机名和IP地址

查找本地计算机的主机名和IP地址的方法有很多。这是使用C程序查找主机名和IP地址的简单方法。我们将使用以下功能&#xff1a;gethostname() &#xff1a;gethostname函数检索本地计算机的标准主机名。gethostbyname() &#xff1a;gethostbyname函数从主机数据库中检索与主机名…

java 定义变量时 赋值与不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...

探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值当基本数据类型作为普通变量(八大基本类型&#xff1a; byte,char,boolean,short,int,long,float,double)只有开发人员对其进行初始化&#xff0c;java不会对其进行初始化&#xff0c;如果不初始…