我希望以下代码向用户询问文件,并且(如果存在)将其存储在curFile中。这应该不是问题,因为curFile是通过引用传递的。如果进程成功,则返回true,否则返回false。
void foo() {
File curFile = null;
// Open a file and set curFile to this file
openFile(curFile);
}
bool openFile(File file) {
// Ask the user for the file to open
File tempFile = getFileFromUserInput()
// If the file exists, set file and (thus curFile) to tempFile and return true
if (tempFile.exists()) {
file = tempFile;
return true;
} else {
return false;
}
}
问题是代码没有设置curFile = tempFile
。我认为这样做的原因是虽然curFile是一个对象并通过引用传递,但我不是在函数中修改这个对象。我在变量中放了一个新对象。但我仍然不确定这是不是因为它不起作用的原因。 (getFileFromUserInput()
实际上是一个Swing方法FileChooser.getSelectedFile()
,如果相关的话。)
一个修复是返回文件对象而不是布尔值。但是这会导致curFile被返回值写入,即使它不应该被写入,例如当文件不存在时。对此有一些修复,比如返回null,如果它是无效文件并将旧文件保存在临时变量中以防返回null,但这很难看。
另一种方法是返回包含在对象中的boolean和File,但这甚至更加丑陋。
所以我坚持使用方法一,还是有一个很好的方法来做到这一点?
答案 0 :(得分:0)
首先,Java中没有通过引用传递(&
的c ++等价物)。所有参数传递都是通过值完成的。分配给参数变量不会更改调用点的参数。只需在openFile中分配实例变量即可。我想你想要这样的东西。
File curFile = null;
bool openFile() {
File tempFile = getFileFromUserInput();
if (tempFile.exists()) {
curFile = tempFile;
return true;
} else {
curFile = null;
return false;
}
}
请注意openFile
缺少参数。