2012-04-10 13 views
4

まず、これはInitialize final variable before constructor in Javaの正確な複製ではありません。多分関連しているかもしれませんが、私を満足させる答えはありません。最終的な変数の代入:宣言またはコンストラクタで?

私の問題は、Swing GUIの最終変数についてです。特に、カスタムActionについてです。 私はfinalの変数とstatic finalの変数の数を持っています。

問題は、変数が実際に定数であれば、何が良いか:構築時に初期化するか、宣言時に初期化するか?

私が上で触れた質問の回答は、一般に、宣言時に割り当てることができるようになるとすぐに変数staticを作成することを指しています。変数は静的コンテキストでは使用されないので、それは私には分かりません。私はフォームがアイコンのように使用するいくつかの画像を持っていますが、あなたのアプリケーションがそれらを変更しない限り、Imageは単に静的なものなので、静的にしました。それは理にかなっている。

一方、Actionは、カスタム内部クラスの新しいインスタンスです。非常に技術的にも静的ですが、違った感じです。単には、を静的コンテキストで使用することはできません。だから私は置く:

private final CustomAction customAction = new CustomAction(); 

私はそれをコンストラクタで初期化するか?どちらが良いですか?または、私はstaticについて間違った方法を考えていますか?

+0

あなたの研究を先に進めるためには、 –

+1

あなたが宣言時に値を知っているなら、それを宣言で初期化してください。それ以外は建設中です。 – titogeo

答えて

5

フィールドが一定であれば、そのクラスのstatic finalメンバーに、

public class Foo{ 
    public static final int BAR = ...; 
} 

それ以外の場合は、コンストラクタ内でフィールドを初期化します。

+1

あなたはそのことを言っている_n_人ですが、誰もその理由を正確には言いませんでしたが、このアプローチを正当化しました。 – MarioDS

+1

@MarioDeSchaepmeester、[こちら](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html)を参照してください。 – mre

+4

@MarioDeSchaepmeesterなぜコンストラクタを呼び出すたびにそれを再初期化するのが常であるのですか?正当性の_plenty_があり、投稿されたリンクは良いスタートです。 – darrengorman

1

宣言時に定数変数を初期化します。読みやすくなります。インスタンスのレベルではなく、クラス・レベルの変数である場合、クラスの異なるインスタンスに対して異なる値を入れても意味がない場合は静的にします。

0

高速アプリケーションの起動とプログラムの部分では、ユーザーが(ダイアログについて)訪問しない可能性があります。静的ではありません。一般的に、静的はあなたが見つけたようにあまり好きではありません。いくつかの理由がありますが、非常に納得のいくものはありません。しかし時にはそれは反パターンまたはそれの兆候です。

あなたの場合でも、私は静的画像を控えるでしょう。ところで、リソースは内部的にキャッシュされます。

+1

これはかなり混乱しています...アプリケーションの実行時に一定のままである画像のセットが必要な場合(たとえば、アプリケーションに数回表示されるツールバーがボタンに同じアイコンを含む場合)、なぜそれらを静的にロードしないのですか? – CodeBlind

+0

すぐに表示されるツールバー、はい。もちろん、静的に作成されたものであっても、ツールバーが作成されたものであれ、ここでは違いはありません。 –

1

私は、静的にしないで正しい軌道に乗っていると思います。なぜなら、あなたのCustomActionオブジェクトは、実際にはコンストラクタでそれらを作成するGUIのインスタンスに対してカスタムです。私はあなたがコンストラクタでそれを初期化するかどうかは、あなたのコンストラクタがコンストラクタの入力引数に基づいて別の方法でCustomActionを初期化できるかどうかによって異なります。

staticと非静的な関係は...特定のオブジェクトタイプのすべてのインスタンスにわたって変数が一定のままである場合、その変数はstaticである必要があります。このは、プログラムの実行時にメモリを保存します。は、各オブジェクトインスタンスの作成時にCPU時間を保存します。そのため、オブジェクトの新しいインスタンスを作成するたびにその定数を初期化する必要はありません。一方、変数がObjectの特定のインスタンスに対して一定のままで、インスタンスごとに異なる場合は、静的ではありません。

プリミティブ値やオブジェクトへの参照を変更したくない場合は、最後にfinalを使用する必要があります。静的または非静的コンテキストは、変数がfinalであるかどうかに実際には影響しません。開発者はその変数を変更したくないので、厳密にはfinalです。その静的コンテキストは、開発者がアクセスする方法にのみ依存します。

関連する問題