Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 声明方法参数final的目的是什么?_Java_Variables_Final - Fatal编程技术网

Java 声明方法参数final的目的是什么?

Java 声明方法参数final的目的是什么?,java,variables,final,Java,Variables,Final,因此,我完全理解您为什么希望使您的课程成为最终课程。假设String类不是final,您有一个库,其中有一个方法将String作为参数并依赖于某个操作的方法,但有人扩展了String类并重写了长度以始终返回-1 但我不明白为什么有人会声明final方法的参数。Java无论如何都是按值传递的,所以如果参数是一个原语,那么它已经是final(在某种意义上)。。如果您正在传递一个引用类型,那么它是否能向方法的调用方保证任何东西?我不这么认为 void foo(final List<Object&

因此,我完全理解您为什么希望使您的课程成为最终课程。假设String类不是final,您有一个库,其中有一个方法将String作为参数并依赖于某个操作的方法,但有人扩展了String类并重写了长度以始终返回-1

但我不明白为什么有人会声明final方法的参数。Java无论如何都是按值传递的,所以如果参数是一个原语,那么它已经是final(在某种意义上)。。如果您正在传递一个引用类型,那么它是否能向方法的调用方保证任何东西?我不这么认为

void foo(final List<Object> o) {
    o.add(new Object());
} // oops?
但我为什么要这么做呢?我总是可以创建一个新变量,但它不会将新对象分配给调用方的变量?(我的意思是,即使参数未声明为final,我也无法更改调用方引用的内容。)

我的问题是,方法声明中的最终参数的用途是什么?是给打电话的人的吗?它能保证什么吗

我还感到奇怪的是,以下内容可以很好地编译:

public interface MyInterface {
    void foo(final Object o);
}

class MyImpl implements MyInterface {
    @Override
    public void foo(Object o) { // final in interface, not final in impl..
    }
}

但是,一旦我理解了我的主要问题,它可能就有意义了。

无论哪种方式,它都不能保证调用者得到任何东西(不管参数是基元类型还是引用类型)

方法参数是一个局部变量,其值由方法的调用方初始化。使其成为final意味着方法体不能局部地将新值分配给该变量,因此它只会在方法体内部产生不同的值(因为在方法体内部将新值分配给这样的变量不会对方法的调用方产生不同)


它确保方法体中使用参数值的任何代码都将使用调用者传递的原始值,而不是方法体中分配给它的其他值。

有时,它可以帮助程序员或维护人员避免更改该变量的值

例如:想象一个采用字符串参数的方法。想象一下,它是一个非常长的方法,有1000行代码。如果参数未标记为final,则第二个程序员会看到更改其中值的机会。第一个程序员在不知道变量被分配了一个新值的情况下,继续该方法的工作。 使其成为最终版本将完全确保第一个程序员的意图被传递给第二个程序员

除此之外,如果您需要在该方法中的任何匿名类中使用此变量,则除非它是final,否则不能使用它


希望这能有所帮助。

所有匆忙响应或标记为dup的人-你们这些家伙的扳机上有一个轻手指。。。OP完美地理解了参数旁边的最后一个关键字的语义,他要求提供动机,因为这似乎是Java的多余添加!我相信唯一可能的答案是实施“良好实践”(而不是重新分配论点)。除此之外,我看不出让一个论点成为最终论点有任何附加价值。因为你可以阅读副本,而不是写这些评论。链接的问题还说你已经写了(例如)。一个有趣的(相关的)讨论可以在这里找到:OP理解它,他的问题是动机是什么。因为Java是“passbyval”,参数是原始引用的副本(假设它是一个对象),所以重新分配对调用方来说并不重要——所以允许参数为final有什么意义呢?参数和局部变量之间并没有什么区别,因为Java是PbV。因此,这个问题可以扩展到“为什么要使局部变量为最终变量”,这个问题已经被问了很多次并得到了回答。尽管重新分配参数是一种糟糕的做法,但它在方法之外没有任何效果。如果你有一个1000行长的方法,你应该关注的是重构它,而不是让一个论点成为最终的。同意。但问题是关于最终变量和最终变量在这种情况下的帮助。你不能说1000行的方法不存在。视情况而定。正如我所说,对于第二个程序员来说,在应用程序的漫长生命周期中不改变变量是出于信息目的。
public interface MyInterface {
    void foo(final Object o);
}

class MyImpl implements MyInterface {
    @Override
    public void foo(Object o) { // final in interface, not final in impl..
    }
}