web-dev-qa-db-ja.com

Javaの静的フィールドの正確な意味は何ですか?

同じクラスのオブジェクトのさまざまなインスタンス間でオブジェクトを共有したいと思います。

概念的には、プログラムの実行中、クラスAのすべてのオブジェクトはクラスBの同じオブジェクトにアクセスします。

staticはシステム全体であり、その使用は推奨されないことがわかりました。つまり、クラスAのオブジェクトをインスタンス化する別のプログラムを同じJVMで実行している場合、これらのオブジェクトは前のプログラムでアクセスしたものと同じBオブジェクトに潜在的にアクセスできますか?

一般的に、静的フィールドを使用する背後にある欠点は何ですか?

代替手段はありますか(実装に多大な労力を必要としない)?

34
LB40

静的とは、「すべてのインスタンスで共有される」という意味ではなく、「特定のインスタンスにまったく関連しない」という意味です。つまり、anyインスタンスを作成せずにクラスAの静的フィールドに到達できます。

同じJVM内で2つのプログラムを実行する場合、「2つのプログラムを実行する」という意味に正確に依存します。静的フィールドは事実上クラスオブジェクトに関連付けられており、クラスオブジェクトはクラスローダーに関連付けられています。したがって、これら2つのプログラムが別々のクラスローダーインスタンスを使用する場合、2つの独立した静的変数があります。両方が同じクラスローダーを使用している場合は、1つしか存在しないため、互いの変更が表示されます。

代替案として-さまざまなオプションがあります。 1つは、「共有」オブジェクトへの参照を、必要な作成する各オブジェクトのコンストラクターに渡すことです。その後、その参照を後で保存する必要があります。これは少し苦痛であり、静的アプローチよりも少し多くのメモリを消費する可能性がありますが、テストが容易になります。

66
Jon Skeet

静的メソッドとメンバーは頻繁に悪用されるため推奨されませんが、これは静的が正しい方法である状況のように聞こえます。複数のプログラム間で共有される静的に関しては、そうではありません。各プログラムは、完全に独立した環境で実行されます。

2
Pesto