2

シナリオは次のようになります。

  1. データベース「overAllCount」に値を含むフィールドがあります。
  2. 私が設計している多くのクラスでこの変数を使用する必要があります。
  3. この「overAllCount」を「OverAllCountClass」という 1 つのクラスでフェッチし、OverAllCountClass.overAllCount のようなクラス名を持つすべてのサブクラスで使用したいと考えています。基本的に静的変数のようなものです。

どうすればいいですか?
私の解決策は次のとおりです。

public Class OverAllCountClass {

    public static int OverAllCount;

     public OverAllCountClass(){

        // Fetch overAllCount from database here and set its value  

       }
 }

////////// このように使用します //////////////

 public class Usecount {

     public void abc(){

          // BUT IT IS NOT POSSIBLE becuase OverAllCountClass is not yet initialize
         int mycount = OverAllCountClass.overAllCount

      }
}

どうすればこれを達成できますか?

4

4 に答える 4

2

あなたの懸念が静的変数overAllCountである場合、初期化されない可能性があり、クラスOverAllCountClassが最初に呼び出されるたびに初期化されるようにする場合は、静的初期化ブロックを使用できます

public class OverAllCountClass {

    public static int overAllCount;

    static {
        overAllCount = fetchOverAllCount();
    }
 }

静的イニシャライザ ブロックは、クラスが最初に読み込まれるときに呼び出されます。そして、クラスが使用されたことを JVM が認識すると、そのクラスが最初にロードされます。

public class Usecount {

     public void abc(){
         //When JVM sees that OberAllCountClass is used here, it executes the static block of OverAllCountClass and by the time below statement is executed, overAllCount is initialized
         int mycount = OverAllCountClass.overAllCount
     }
}
于 2013-09-03T07:09:22.997 に答える
0

他のクラスによって変更/悪用される可能性のあるpublic static 変数を持つのではなく。実装を非表示にして、必要に応じて遅延読み込みなどを実行できる特定の API を提供します。

public static final Value getValue(){
//evaluate private field
return value;
}

この API は、ユースケースに応じて、静的メソッドまたはシングルトン スコープのメソッドにすることができます。

于 2013-09-03T07:11:55.773 に答える
0
public Class OverAllCountClass {

    protected int overAllCount; //will allow you to use in subclass too

     public OverAllCountClass(){

        // Fetch overAllCount from database here and set its value  
    }

    public int getOverAllCount(){
       return overAllCount;
    }
 }


public class Usecount {

     //pass the instance of overAllCountInstance to UseCount somehow using constructor or setter
     private OverAllCountClass overAllCountInstance;
     public void abc(){
         int mycount = overAllCountInstance.getOverAllCount();

      }
}

ここで使用する必要はありませんstatic。getter を使用してカウントを取得する

于 2013-09-03T07:10:21.263 に答える