如果我们将一个私有的最终实例变量传递给私有方法,那么当作为参数传递时,我们是否在函数中使用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。 优点。防止重复的最终修饰符 缺点:不提供明确的图片,例如:如果GraphAlgo是一个10000行代码,那么只需查看函数'runAlgoUsingSource',他就没有视觉访问权来理解'source'是否是最终的。
这种情况下的一般惯例是什么?
答案 0 :(得分:4)
这里,source
已经是一个实例变量。为什么将它传递给方法?就此而言,
private runAlgoUsingSource(final source) {
source
现在是另一个变量,作为局部变量确定范围,并且命名与实例变量相同。 (它还需要一个类型。)本地source
final
是否this.source
不取决于final
(实例变量)是{{1}}。
答案 1 :(得分:3)
一个是实例变量:
private final SomeType source;
另一个是方法:
private runAlgoUsingSource(final SomeType source) {
第一个说实例变量不能改变(如果它是引用它不能引用不同的对象),第二个说不能改变方法参数。
答案 2 :(得分:0)
这不是惯例;两个final
声明意味着不同的东西。即使字段的值流入参数,该字段也可以是final
,参数不是final
,反之亦然。
这是一个有争议的问题,但我的观点是,如果需要,你应该只声明一个参数final
- 基本上你需要声明一个参数final的唯一原因是你在其中使用它的值一个匿名的内部阶级。另一方面,字段应为final
,除非您明确要修改它们。
答案 3 :(得分:0)
两个final
修饰符不相关。一个人让实例成员生活在堆 final
上。另一个正在制作方法的局部变量(它碰巧共享相同的名称)并位于堆栈 final
。
标记方法局部变量 final
可以让JVM优化某些东西(因为它现在知道方法不会修改它),这是一个很好的做法。标记实例成员 final
更多的是声明实际常量。