2012-03-13 9 views
2

finalフィールドに一定値のコンパイル時に割り当てられたJavaでは、通常staticと宣言するのが理にかなっています。関連するPMDルールに従ってオーバーヘッドを節約します。最終的なクラス変数をGWTで静的にする

GWTで生成されたJavascriptコードに関して何か意味があるのでしょうか?それが最終的に宣言されたときに変数が割り当てられている場合

+1

ここで、最終変数を静的にする必要があると読んだことはありますか?静的変数は通常は設計の悪い兆候ですが、最終的な非静的変数を持つことは完璧です。 –

+0

これは私のコードでチェックされているPMDルールです。 http://pmd.sourceforge.net/rules/design.html「FinalFieldCouldBeStatic」の章を参照してください。 – jabal

+1

申し訳ありませんが、あなたのテキストは完全に誤解を招きます。このルールでは、一定の値を持つ最後のフィールド(42など)を静的にすることができます。最終的な変数を静的にする必要があるとは言いません。大きな違いがあります! –

答えて

3

、[はい、静的感覚の一定量になりますが、それは静的であってはならない場合があります。

public MyClassWithFinal { 
    private final String finalVar; 
    public MyClassWithFinal(String name) { 
     this.finalVar = name; 
    } 
} 

別の場合:インスタンスの場合varは文字列または数値定数ではありませんが、コンストラクタを実行する必要があります。そのコンストラクタは呼び出されるたびに副作用があるため、複数回実行するのとは異なります。

GWTはインライン/インテルの定数ストリング値を扱うので、複数のストリングフィールドがすべて同じ値に割り当てられていると、GWTはそれを検出してすべて静的にします。

public final String constant = "Some Constant that really ought to be static"; 

GWTは宣言されている場合を除いて決して割り当てられないことに気付き、フィールド自体も削除することがあります。

最良のルールは、最も読みやすい(最も読みやすく、保守性が高く、効率的な)Javaコードから始め、GWTが何か特定のものを必要とする場合にのみ中断することです。これはそのようなケースの1つではありません。コンパイラは、これをどのように記述しても同じ基本最適化を実行する必要があります。

+0

を更新しました。たとえば、プリミティブ型の場合はそうです。 GWTコンパイラの最適化のために文字列が意味をなさないのでしょうか? – jabal

+1

はい、いいえ:コンパイラは最終的なフィールドについてはかなりスマートになりますが、何かがすべてのインスタンスで常に同じであれば、おそらくstaticを使用することを意味します - これは、最後の段落で最も読みやすくすることを意味します。それぞれのオブジェクトのフィールドの異なるインスタンスを本当に必要としている場合は、静的なままにしておきますが、それらのキーワードはコンパイラだけでなく、将来のコード読者に役立つ情報を伝えます。 –

+1

答えの最初のコードチャンクは、PMDが最終的なStringフィールドについて不平を言ってはならず、それを静的にするのが正しくないか有用でない場合です。しかし何かが一定であれば、静的な方がより意味をなさないかもしれません。 –

2

finalとマークされたフィールドは、それが不変であることを意味するものではなく、参照が他のメモリチャンクを指し示さないことを意味します。したがって、実際に不変である場合、またはプリミティブである場合は、フィールドを静的にすることは意味をなさないでしょう。

たとえば、別のリストオブジェクトを決して指していないことを確認するには、リストをfinalとして宣言するのが一般的ですが、リスト自体はデータで埋められ、クリアされ、再度埋め込まれます。もちろん、そのようなリストを宣言する各オブジェクトは、すべてのインスタンス間でそれを共有することを義務付けていません。

private final List<...> list = new ArrayList<...>(); 

最後のキーワードは、決して変更する必要のない参照をnullに設定するなど、間違いを防ぐためのものです。

+0

あなたの答えは私のGWT特有の質問には本当に関係していないと感じます。明解のために+1してください。 – jabal

関連する問題