0

我希望以下代码向用户询问文件并(如果存在)将其存储在 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 ,但这很难看。

另一种方法是返回包装在一个对象中的布尔值和文件,但这更难看。

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

4

1 回答 1

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.

于 2012-04-06T04:59:03.617 回答