淘汰最终变量

时间:2013-11-13 10:20:31

标签: java null final

为什么以下代码可能? (这是我在处理其他代码时想出的一个例子)

public String getLogIdentifierFromFile(final File file) {
    //this.file = null; //Gives compiler error as obviously expected
    nullify(file);
    return "";
}

public void nullify(Object object) {
    object = null;
}

我怎样才能确保top函数的final实际上有效?这次是我使用nullify方法,但它也可以是我的方法需要调用的任何人的代码。

6 个答案:

答案 0 :(得分:7)

代码没有按照您的想法执行。

final适用于参考。您的代码会将原始final引用的final副本归零。 The copy is taken when you call nullify().

如果在致电file后检查nullify(),您会发现它保持不变。

因此,这不是final如何运作的漏洞。

答案 1 :(得分:2)

声明final File file仅将参考文献作为最终参考。这是为了确保您不会意外地为此变量重新分配值。

在您的代码object = null; // 'object' is not marked as a final reference. Hence it works

答案 2 :(得分:2)

这是因为object在您的第二种方法中不是final

所以:

public String getLogIdentifierFromFile(final File file) {
    //Have a final reference to file
    //Pass it into nullify
    nullify(file);
    //Reference to file is unchanged
    return "";
}

public void nullify(Object object) {
    //get a reference to some object
    //set it to null
    object = null;
}

考虑到这一点,getLogIdentifierFromFile正在通过名片,其中包含filenullify的详细信息,然后nullify正在删除卡片上的地址。

这不会影响file生活的地方,nullify只会忘记file所居住的地方。

Java在这方面略显混乱,因为它通过值传递对象引用。这意味着当您将引用传递给另一个方法时,它会创建引用的副本并传递该副本。

这意味着如果您对引用执行操作(例如File.setExecutable()),则操作将在引用的对象上发生。如果您更改了引用本身,即重新分配它,那么这只会影响本地副本。

final仅阻止重新分配参考。

答案 3 :(得分:0)

当您更改object var时,您不会更改file var - Java按值而非参考传递参数

答案 4 :(得分:0)

nullify函数(或任何其他函数)接收对象的引用,然后通过赋值{{1}更改引用它。 它不会更改原始对象或对象的原始引用,因此null这一事实无关紧要。

答案 5 :(得分:0)

       public String getLogIdentifierFromFile(final File file) {
          //this.file = null //Gives compiler error as obviously expected
              nullify(file);
           return "";
          } 

         public void nullify(final Object object) {
          object = null; //this will produce error

          }