問題の歴史:
Javaの初期から、クラスの静的メンバーという概念が存在しており、これはインスタンスメンバーとは異なります — これらの変数はオブジェクトではなく、クラスレベルで格納されます。これにより、クラスのすべてのインスタンス間でデータを分けたり、定数やサービス構造を使用したりできます。
問題:
静的フィールドの主な目的は、クラスのすべてのオブジェクトにデータを提供することや、唯一のアクセスポイントを実現することです。しかし、静的を誤って使用すると、グローバル状態やデータ競合、テストでの問題に関連する難解なバグを引き起こす可能性があります。
解決策:
静的フィールドは、staticキーワードを用いて宣言されます:
public class Counter { public static int globalCount = 0; public Counter() { globalCount++; } }
インスタンスが作成されるたびにカウンターは増加し、その値はCounter.globalCountを介してオブジェクトに関係なくアクセス可能です。
主な特徴:
オブジェクトを介して静的フィールドにアクセスすることはできますか、クラス名を介してではなく?
はい、構文はオブジェクトを介して静的フィールドにアクセスすることを許可していますが、これは可読性が低く、時には混乱を招くコードにつながります。常にクラス名を介してアクセスする方が良いでしょう。
Counter c = new Counter(); System.out.println(c.globalCount); // 動作しますが、お勧めしません
静的フィールドはプライベートであることができますか?
はい、アクセスレベルには制限がありません。プライベート静的フィールドは、公開静的メソッド(例えば、Singleton用)と共に使用されることがよくあります:
public class Singleton { private static Singleton instance; public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
非静的な値に依存して静的フィールドを初期化しようとするとどうなりますか?
そのようなコードはコンパイルされません。なぜなら、非静的フィールドは静的フィールドの後で初期化されるからです。静的フィールドは非静的フィールドを直接参照できません。
大規模なアプリケーションでは、ユーザーに特有なキャッシュデータを保存するためにstaticフィールドが使用されます。
長所:
短所:
定数(例えば、エラーメッセージや標準パラメータ)を保持するためにpublic static final Stringを使用します。
長所:
短所: