7

私の同僚はnull、finally ブロックで参照を設定します。これはナンセンスだと思います。

public Something getSomething() {
    JDBCConnection jdbc=null;
    try {
        jdbc=JDBCManager.getConnection(JDBCTypes.MYSQL);
        ...
    }
    finally {
        JDBCManager.free(jdbc);
        jdbc=null; // <-- Useful or not?
    }
}

どう思いますか?

4

7 に答える 7

13

あなたは正しいjdbcです、ローカル変数であるため、getSomething()メソッドが返さjdbcれるとスコープ外になり、ガベージコレクションの対象になります。これは、実質的にnullに設定するのと同じです。したがって、コードの次の行で変数がスコープ外にある場合、変数を null に設定しても意味がありません。

必要な最小のスコープに変数を制限することをお勧めします。たとえば、for ループ内でのみ変数が必要な場合は、for ループで宣言すると、コードが for ループを終了したときにガベージ コレクションの対象になります。これにより、メソッドの複雑さが軽減されるだけでなく、ローカル変数を null に設定する必要性がまったくなくなり、コードがよりモジュール化され、読みやすく、維持しやすくなるという利点があります。

于 2010-06-09T08:28:47.723 に答える
5

ローカル変数なので、とにかくスコープ外になります。それはナンセンスです。

それが長寿命オブジェクトのインスタンス変数 (メンバー変数) である場合、ガベージ コレクターがオブジェクトを破棄するのを妨げる可能性があるため、便利です。

于 2010-06-09T08:29:13.993 に答える
2

はい、これはほとんどナンセンスです。動機は通常、ガベージ コレクターを「助ける」ことですが、とにかく参照がクリアされるため、これはまったく役に立ちません。少なくともVMにとっては害はありませんが、あなたの目と正気は別の問題です.

ただし、この例では Something が返されません。例が不完全で、実際に finally ブロックの後にステートメントがある場合、jdbc を に設定nullすると、使用の抑止力として機能し、発生する NPE は、finally ブロックの後の使用をすぐに通知します。

于 2010-06-09T08:29:03.617 に答える
1

この特殊なケースでは、技術的に言えば、それは本当に役に立ちません。メソッドが戻ると、メソッドはjdbcもう存在せず、接続への参照を保持しないため、ガベージ コレクションには影響しません。

コーディングスタイルの問題です。ある日、finally ブロックの後にさらにコードを追加すると、小さな利点があります。jdbcその後、JDBCManager によって解放されたため、もう使用できないことがすぐに明らかになります。

そうです、破棄されたリソースへの参照を無効にすることをお勧めします。

于 2010-06-09T08:36:19.653 に答える
1

既に書かれているように、この場合はメソッドが finally の後で終了するため、役に立ちません。
try-finally の後にコードがある場合は、最終的にその使用を防ぐためにそれを行います。そして、それが役立つ(非常にまれな)状況があります。
この記事をご覧ください: Java Memory Puzzle

于 2010-06-09T09:41:27.063 に答える
0

次に、戻る前にすべてのメソッドですべてのローカル変数を null に設定する必要があります。

とにかく、JVMはおそらくラインオフを最適化するので、実行時の影響はまったくありません。

于 2010-06-09T18:21:16.387 に答える
-2

メソッドを終了するだけでなく、finallyブロックの後にさらにコードがある場合は、ガベージコレクターがメソッドをクリーンアップするのに役立つ可能性があります。

于 2010-06-09T08:32:55.520 に答える