为什么将方法参数标记为final是一种良好的做法?

时间:2014-02-04 21:52:06

标签: java oop final

假设我通过传递一个对象来调用方法。

public String retrieveXyz(Criteria criteria){

//get some info out of criteria and do something.

}

最好使条件成为最终,以便此处理程序不能用于定位除传递的其他对象或其开销之外的其他对象,因为这不会保护对象状态不被更改。

public String retrieveXyz(final Criteria criteria){

//get some info out of criteria and do something.

}

3 个答案:

答案 0 :(得分:5)

如果将方法参数标记为final,则无法在方法范围内修改参数值:

public void xyz(final String parameter) {
    parameter = "..." //compiler error!
}

了解parameter的值是对传递给方法的对象的引用,而不是对象本身的值。

通过将方法参数标记为final,编译器将在编译时抛出错误。这可以提醒您不要在方法中修改参数的值。

修改方法中的原始参数被认为是一种不好的做法。 [1]

如果参数的值可以更改为引用另一个对象,则可能无法立即清楚在方法体内的任何给定点引用了哪个对象。

请考虑以下事项:

public void xyz(String parameter) {
    //Complicated logic that might span 20-30 lines.

    parameter = "Joe";

    //More complicated logic that might span a few lines.

    //New logic being added that needs reference to the value of the parameter.
}

在一个复杂的方法中,如上所述,程序员可能很难识别出哪个对象parameter引用。此外,如果程序员需要引用parameter,他就不再拥有。{/ p>


  1. Is it a good practice to change arguments in Java

答案 1 :(得分:3)

方法参数中的

final在大多数情况下没有区别,您仍然无法在方法中更改其地址,但可以更改其属性。

有时你可能需要使用final,除非a是最终的,否则run方法不会被编译,尽管你可以将它分配给其他最终对象等,但为什么打扰那个。

public void foo(final String a) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            System.out.print(a);
        }
    }); 
}

答案 2 :(得分:1)

PMD会建议您这样做:http://pmd.sourceforge.net/pmd-4.3/rules/optimizations.html

这允许有用的优化,并在您可能在代码中执行不需要的操作时发出警告。像Eclipse和Intellij这样的IDE可以选择自动执行此操作,这样做是明智的。