文件对象未被函数修改

时间:2012-04-06 04:34:52

标签: java swing file reference

我希望以下代码向用户询问文件,并且(如果存在)将其存储在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,但这甚至更加丑陋。

所以我坚持使用方法一,还是有一个很好的方法来做到这一点?

1 个答案:

答案 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缺少参数。