我是否需要指定«;最终»;Java中所有不可变变量的修饰符?

我是否需要指定«;最终»;Java中所有不可变变量的修饰符?,java,coding-style,clean-architecture,Java,Coding Style,Clean Architecture,在我读过的一本Java书中,“一般来说,如果不需要重新分配变量,最好总是将变量声明为final,将常量字段声明为static final“。我开始遵循这个建议。但当我开始编写代码时,我发现几乎我所有的变量都是不可变的。但使用关键字«final»会使行变长,因此代码更难阅读,这违反了干净代码的原则。因此,我的问题如下: 将所有不可变变量设置为«最终»是否是一种良好的做法 您是否对程序中的所有不可变变量使用«final»修饰符 如果没有,何时使用«最终»以及何时跳过使用此关键字 这是我的一个来自的程

在我读过的一本Java书中,“一般来说,如果不需要重新分配变量,最好总是将变量声明为final,将常量字段声明为static final“。我开始遵循这个建议。但当我开始编写代码时,我发现几乎我所有的变量都是不可变的。但使用关键字«final»会使行变长,因此代码更难阅读,这违反了干净代码的原则。因此,我的问题如下:

  • 将所有不可变变量设置为«最终»是否是一种良好的做法
  • 您是否对程序中的所有不可变变量使用«final»修饰符
  • 如果没有,何时使用«最终»以及何时跳过使用此关键字
  • 这是我的一个来自的程序示例。所有变量都是final。在存储库中的所有其他程序中几乎都是相同的情况

    import java.util.Scanner;
    公共类非数值
    {
    公共静态void main(字符串[]args){
    最终var输入=新扫描仪(System.in);
    最后一个var短语=input.nextLine();
    最后的字符串[]数字={“零”、“一”、“二”、“三”、“四”、“五”、“六”、“七”、“八”、“九”、“十”};
    final var updatedphase=新的StringBuilder();
    for(最后一个var单词:短语.split(“”){
    试一试{
    最终整数=整数.parseInt(字);
    
    如果(number>=0&&number有多个原因需要声明变量
    final
    ,包括:

    • 简单性-最终变量必须初始化,并且不能重新分配。因此,一段代码使读者无需对可变状态或未初始化变量进行推理。编译器将防止这两种情况发生。这意味着最终变量还将防止意外重新分配或意外事故等错误l使用未初始化的类成员

    • 自我记录-声明为final的变量或类成员是向用户发出的一个明确信号,表明永远不应重新分配该变量

    • 线程安全性-无需同步即可安全读取最终引用。不可变对象(即所有成员字段均为最终字段,且原语或对其他不可变对象的引用)无需同步即可同时访问

    • 编译器必需的用例-只有有效的最终变量才能在try with resources表达式中引用,或由lambdas捕获。有关最终变量、有效最终变量和隐式最终变量之间的差异的概述,请参阅以下本节

    另一方面,我注意到有使用“纯函数”语言(如F#和Haskell)经验的开发人员倾向于自由使用
    final
    。在这些语言中,所有值都是“默认不变的”.在使用这些语言之后回到Java时,我发现自己错过了“默认不变”方法所提供的简单性和自由性

    将所有不可变变量设置为final是一种好的做法吗? 作为一名专业开发人员,我推荐以下做法,这些做法在过去十年中对我很有帮助:

    • 默认情况下,类成员应该是declare
      final
      。只有在我们明确希望使其可变的情况下,才应该将成员声明为非final
    • 方法中的变量应声明为最终变量,其中所提供的值(在简单性和正确性保证方面)超过了诸如混乱之类的任何问题。对于变量较少的短方法,好处是最小的。对于变量较多的长方法,好处会更大
    由于可变状态的复杂使用,使用final方法变量还可以防止某些难以推理的编码模式。可变状态有时是必要的,但通常不是

    作为练习,尝试在一天内默认声明所有方法变量final,以了解支持此方法所需的模式和实践

    这里没有通用的最佳实践。在上述优点和简洁性之间需要进行权衡(有些人认为
    final
    关键字会增加混乱,尽管我不同意)。final的使用也可能取决于与其他编码实践的兼容性(例如,有些人喜欢使用默认构造函数,然后使用setter填充字段,我认为这不是一个好的做法)

    “总是
    final
    ,除非有理由不这样做”的方法有很多。也有很多人主张更谨慎地使用final,包括《干净的代码》中的Bob Martin。政府在这个问题上明显保持沉默

    我不同意自由使用
    final
    违背干净代码的原则,干净代码重视简单性和自文档化代码

    您是否对程序中的所有不可变变量使用
    final
    修饰符? 如上所述,一般来说:

    • 类成员-是,
      final
      ,除非有理由不这样做,对于给定的类成员
    • 方法变量-不总是,但通常用于非平凡方法

    谷歌内部的做法是,除非实际需要,否则不会将局部变量设为final(这在Java 8之后很少是有效的final)1.不。如果你的变量是有效的
    final
    编译器能够检测到这一点,那么这是毫无意义的。2.不。我不知道。3.当我需要一个常量并确保变量不存在时下一个可能的变化;一个不可变的变量(比如
    String
    )不是我经常做的
    final
    (exp