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()です。)

解決方法の 1 つは、ブール値ではなくファイル オブジェクトを返すことです。しかし、それでは、ファイルが存在しない場合など、そうすべきではない場合でも、curFile が戻り値によって上書きされてしまいます。無効なファイルの場合は null を返し、null が返された場合は古いファイルを一時変数に保存するなど、これにはいくつかの修正がありますが、それは醜いです。

もう 1 つの方法は、オブジェクトにラップされたブール値とファイルの両方を返すことですが、これはさらに醜い方法です。

それで、私は方法1で立ち往生していますか、それともこれを行う良い方法はありますか?

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 に答える