5

次のコードが可能なのはなぜですか? (他のコードの作業中に思いついた例にすぎません)

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;
}

finalそして、 from the top 関数が実際に効果があることをどのように確認できますか? 今回は私がメソッドを作成していnullifyますが、私のメソッドが呼び出す必要があるのは誰のコードでもかまいません。

4

6 に答える 6

7

コードは、あなたが思っていることをしません。

final参照に適用されます。あなたのコードは、元の参照のfinalコピーを無効にします。を呼び出すと、コピーが取得されますfinalnullify()

fileを呼び出した後に調べるとnullify()、変更されていないことがわかります。

したがって、これはfinal動作の抜け穴ではありません。

于 2013-11-13T10:22:29.393 に答える
2

ステートメントfinal File fileは、参照のみを最終的なものにします。これは、誤ってこの変数に値を再割り当てしないようにするためです。

あなたのコードでobject = null; // 'object' is not marked as a final reference. Hence it works

于 2013-11-13T10:22:09.533 に答える
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;
}

これは、 togetLogIdentifierFromFileの詳細が記載された名刺を渡してから、カードの住所を削り取っていると考えてください。filenullifynullify

これはどこに住んでいるかには影響しません。ただどこにfile住んでいるnullifyかを忘れてしまいfileます。

Java はオブジェクト参照を値で渡すため、この点でやや混乱します。つまり、参照を別のメソッドに渡すと、参照のコピーが作成され、そのコピーが渡されます。

これは、参照に対してアクション ( などFile.setExecutable()) を実行すると、そのアクションが参照先のオブジェクトに対して実行されることを意味します。参照自体を変更した場合、つまり再割り当てした場合、これはローカル コピーにのみ影響します。

final参照の再割り当てを防止するだけです。

于 2013-11-13T10:23:36.523 に答える
0

nullify関数 (またはその他の関数) は、オブジェクトへの参照を受け取り、その参照代入nullて変更します。元のオブジェクトまたはオブジェクトへの元の参照は変更されないため、変更されたという事実finalは重要ではありません。

于 2013-11-13T10:23:45.727 に答える
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

          }
于 2013-11-13T10:24:00.120 に答える
0

objectvar を変更しても var は変更されませんfile- Java は引数を参照ではなく値で渡します

于 2013-11-13T10:23:03.753 に答える