Java 是否应避免重复的最终声明?
如果我们有一个私有的final实例变量要传递给私有方法,那么当作为参数传递时,我们是否在函数中用final修饰符重新声明它?例如: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
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参数的另一个用途是必须从该方法中声明的匿名内部类引用它。