Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.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_Final - Fatal编程技术网

Java 是否应避免重复的最终声明?

Java 是否应避免重复的最终声明?,java,final,Java,Final,如果我们有一个私有的final实例变量要传递给私有方法,那么当作为参数传递时,我们是否在函数中用final修饰符重新声明它?例如: public class GraphAlgo { private final source; public GraphAlgo(source) { this.source = source } public void runAlgo() { runAlgoUsingSource(source); } privat

如果我们有一个私有的final实例变量要传递给私有方法,那么当作为参数传递时,我们是否在函数中用final修饰符重新声明它?例如:

public class GraphAlgo {

  private final source;

  public GraphAlgo(source) {
     this.source = source
  }

  public void runAlgo() {
     runAlgoUsingSource(source);
  } 

  private runAlgoUsingSource(final source) {  // here final is declared on a final field
    //-- whatever.
  } 
}
不要为已经是final的参数声明final。 有利条件防止复制最终修改器 缺点:不提供明确的图片,例如:如果GraphAlgo是一个10000行代码,那么只需查看函数“runAlgoUsingSource”,他将无法直观地了解“source”是否为最终版本


这种情况下的一般惯例是什么?

这里,
source
已经是一个实例变量。为什么要将其传递给方法?关于这件事,在这里

private runAlgoUsingSource(final source) {

source
现在是另一个变量,作用域为局部变量,名称与实例变量相同。(它还需要一个类型。)此本地
是否为
final
并不取决于
此.source
(实例变量)是否为
final
,这不是惯例问题;两个
final
声明的含义不同。即使字段的值流入参数,字段也可以是
final
,参数可以是non-
final
,反之亦然

这是一个有争议的问题,但我的观点是,如果需要,您应该只声明一个参数
final
——基本上,您需要声明一个参数final的唯一原因是如果您在匿名内部类中使用它的值。另一方面,字段应该是
最终的
,除非您明确地想要修改它们。

一个用于实例变量:

private final SomeType source;
另一个是一种方法:

private runAlgoUsingSource(final SomeType source) {

第一个表示实例变量不能更改(如果它是引用,则不能引用其他对象),第二个表示方法参数不能更改。

两个
最终的
修饰符不相关。使实例成员生活在堆
final
上。另一个正在生成方法的局部变量(恰好共享相同的名称),并且位于堆栈
final


将方法标记为局部变量
final
可以让JVM优化某些事情(因为它现在知道该方法不会修改它),这是一种很好的做法。标记实例成员
final
更多地是在声明一个实际常数的行中进行的。

如果它已经是类的成员,为什么要将其作为参数传递?请指定这些变量的类型,并确保修复任何其他语法错误以避免混淆。这两个
变量完全不同
GraphAlgo.source
runAlgoUsingSource
的局部变量
source
无关,只是它们碰巧有相同的名称。它们可以有不同的类型,一个是基元,另一个是引用,任何东西都可以!重要的是不要混淆它们。好的,首先,您的代码不是有效的Java,因为您省略了
source
实例变量的类型和
source
参数。其次,两个
最终的
声明实际上意味着不同的事情。一种是实例变量不会改变(构造函数和静态初始化器中除外);一种是指参数的值在方法期间不会更改。。第二,这两项最后声明实际上意味着不同的事情。一种是实例变量不会改变(构造函数和静态初始化器中除外);一种是指参数的值在方法过程中不会改变——谢谢这是我的答案+1,我实际上非常强烈地感觉到,
final
应该是默认值,选择
nonfinal
。无论如何,
final
local参数的另一个用途是必须从该方法中声明的匿名内部类引用它。