インスタンスメソッドから静的フィールドへの書き込みを防ぐために必要なコード変更について説明している投稿をSOで見つけましたが、そうするのはなぜ良い習慣ではないのですか?なぜJava設計者はこれを許可したのですか?言い換えれば、誰かがこれを行おうとしたときにコンパイラがエラーをスローしないのはなぜですか?
3 に答える
'findbugz'ドキュメントの言葉で:
このインスタンスメソッドは静的フィールドに書き込みます。複数のインスタンスが操作されている場合、これを正しく行うには注意が必要であり、一般的には悪い習慣です。
つまり、それが常に間違っているわけではなく、単にエラーの原因となることが多いということです。静的フィールドを操作するインスタンスオブジェクトは、たとえば共有オブジェクトの遅延初期化に役立つ場合があるため、常に間違っているとは限りませんが、正しく取得するのは難しい場合があります(特に、複数のスレッドが同時に実行されている場合)。
上記に加えて、ドキュメントの観点から、次のフォームを使用すると、誰かがそれをインスタンスフィールドであると簡単に推測できます。
someField = null
また
myObj.someField = null
フォームを使用する
myClass.someField = null
それをより明確にし、findbugz警告を防ぎます(どうやら、私はテストしていません)。説明されているマルチスレッドの問題を防ぐことはできないことに注意してください。
たとえば、アリを管理するアプリケーションがあり、アリのクラスから作成されたアリの総数にアクセスできる必要がある場合に便利です。これは、新しいantを作成するたびにantの総数を追跡する静的メソッドに書き込むことで実行できます。静的メソッドaddAnt()に書き込みます。