Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 构造函数参数是否应声明为最终参数_Java_Constructor_Final - Fatal编程技术网

Java 构造函数参数是否应声明为最终参数

Java 构造函数参数是否应声明为最终参数,java,constructor,final,Java,Constructor,Final,我见过函数参数被声明为最终的代码。令人惊讶的是,没有看到构造函数参数声明为final的代码 例如: 为什么这不常见?代码变得冗长是有具体原因还是事实?不需要定义final,但是如果在内部类中使用final参数,则禁止在没有final的情况下传递参数 请点击此处: Java始终只将参数的副本传递给函数。这意味着final对参数所做的唯一事情就是不允许在函数内部赋值变量 赋值给函数参数(无论它是在构造函数中还是在任何其他函数中)被认为是不好的样式,因为这会将参数的含义从函数参数更改为函数局部变量。这

我见过函数参数被声明为最终的代码。令人惊讶的是,没有看到构造函数参数声明为final的代码

例如:


为什么这不常见?代码变得冗长是有具体原因还是事实?

不需要定义final,但是如果在内部类中使用final参数,则禁止在没有final的情况下传递参数

请点击此处:


Java始终只将参数的副本传递给函数。这意味着final对参数所做的唯一事情就是不允许在函数内部赋值变量

赋值给函数参数(无论它是在构造函数中还是在任何其他函数中)被认为是不好的样式,因为这会将参数的含义从函数参数更改为函数局部变量。这个名字的意思就这样消失了

第二个原因是类可能具有字段
field1
,构造函数可能具有名为
field1
的参数。声明参数final可以避免类似
field1=field1的错误当一个人实际指的是
this.field1=field1


本质上,在函数参数上声明final是一个有趣的问题,并且增加了一点安全性(但是好的ide应该警告赋值,无论如何都没有效果)。但是,为了安全起见(可以说是非常小的数量),您必须输入更多的内容,这就是为什么不经常使用它的原因。

有时,您必须声明它们
最终

public class Test {
  final Runnable runner;

  public Test(final String text) {
    runner = new Runnable () {
      @Override
      public void run () {
        System.out.println("Run: "+text);
      }
    };
  }
}

但一般来说你不必这么做,而且我认为这只是一种不必要的干扰

那么,除了额外的字符外,它还会添加什么?它强制执行良好的编码实践这个重复的问题是什么?阅读这个@jeroenvanevel结果不一样,因为
final
强制执行通常认为是良好的实践(参数重新分配)。如果命名约定允许的话,它在设置实例属性时消除了一种编码错误,并且消除了一种Java brain fart(思维重新分配将改变调用方)。这是否值得长篇大论是另一个问题(例如,我自己不使用这种模式)。另一个观点,请参阅@Azzu的答案和上面塔拉引用的博客--。
public class Test {
  final Runnable runner;

  public Test(final String text) {
    runner = new Runnable () {
      @Override
      public void run () {
        System.out.println("Run: "+text);
      }
    };
  }
}