为什么以下代码可能? (这是我在处理其他代码时想出的一个例子)
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
方法,但它也可以是我的方法需要调用的任何人的代码。
答案 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
正在通过名片,其中包含file
至nullify
的详细信息,然后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
}