2012-04-27 19 views
0

el言語で使用される静的クラスの範囲は何ですか?jsf式言語(el)クラス関数のライフスコープ

私はアプリケーションの適用範囲を想定していますか?

私はそれをデバッグモードでテストし、レイジーロード属性は複数のウィンドウ、ブラウザで一度しか初期化されません。

private static Object[] objects = null; 

public static Object[] getObjects() 
{ 
    if(ElClass.objects == null) 
     //init objects 
    return ElClass.objects; 
} 

答えて

1

具体的なインスタンスの手段はありません。 EL関数のクラスは構築されていません。 EL関数は完全にステートレスになるように意図されています。静的変数は、定義ごとにJVM全体(またはそれを呼び出すときはアプリケーション全体)です。通常のJavaコードでは、new ELClass().getObjects()の代わりにELClass.getObjects()を実行するだけです。

具体的な例としては、初期化を静的イニシャライザブロックで行うことをお勧めします。その怠惰な読み込みは不要です。

private static final Object[] objects; 

static { 
    // Init objects. 
} 

public static Object[] getObjects() { 
    return objects; 
} 

プライベートコンストラクタを追加して、関数クラスを構築できないようにすることをおすすめします。

private ELClass() { 
    // Prevent construction. 
} 
+0

新しいことを学びましたが、その静的ブロックについては知りませんでした。コンストラクタは悪いJavaデザインのように見えません。しかし、ユーティリティクラスが大きくなり、このタイプのメソッドがたくさんあるとどうなりますか?静的なブロックに熱心にそれらのすべてをロードするとオーバーヘッドになる可能性がありますか? – djmj

+0

プライベートコンストラクタは、クラスがステートレスであり、静的メソッドしか持たない場合、間違ったデザインではありません。 IDEやコードタクシーチェッカーは、インスタンス上で静的メソッドを呼び出すたびに警告することさえあります。クラスが大きくなる場合は、複数のクラスに分割します。 Apache Commonsライブラリの例を見てください。オーバーヘッドは、クラスのロード中に1回しか発生しない場合は無視されます。 – BalusC