2011-12-04 13 views
0

私は将来のクラスへの静的参照を保持するFutureContentクラスを持っています。なぜこのようにしたのか分かりません。すべてのメソッド呼び出しが静的である必要はありません。このようにして別の理由がありますか?このように「静的」クラスを使用する理由は何ですか?

//One possible use of Future class 
    FutureContent.future.deleteContent("test"); 

    public class FutureContent { 
      public static Future future = new Future(); 
    } 


public class Future{ 
     private final Object lock = new Object(); 

     private String str; 

     private Hashtable content = new Hashtable(); 

     public void addContent(Object key, Object value){ 

      synchronized(lock){ 
       if(content.containsKey(key)){ 
        content.remove(key); 
        content.put(key, value); 
       } 
       else { 
        content.put(key, value); 
       } 
      } 
     } 

     public void clearContent(){ 
      content.clear(); 
     } 

     public void deleteContent(Object key){ 
       if(content.containsKey(key)){ 
        content.remove(key); 
       } 
     } 

     public boolean getBoolean(Object key){ 
      if(!content.contains(key)){ 
       return false; 
      } 
      else { 
       return ((Boolean)content.get(key)).booleanValue(); 
      } 
     } 

     public void addBoolean(Object key , boolean value){ 

      Boolean b = new Boolean(value); 

      synchronized(lock){ 
       if(content.containsKey(key)){ 
        content.remove(key); 
        content.put(key, b); 
       } 
       else { 
        content.put(key, b); 
       } 
      } 
     } 

     public Object getContent(Object key){ 
       return content.get(key); 
     } 

     public void setString(String str){ 
      synchronized(lock){ 
       this.str = str; 
       lock.notifyAll(); 
      } 

     } 

     public String getString(){ 
      synchronized(lock){ 
        while(this.str == null) 
        try { 
         lock.wait(); 
        } catch (InterruptedException e) { 
         return null; 
        } 
        return this.str; 
      } 
    } 


     private JSONObject value; 
     public void set(JSONObject t){ 
      synchronized(lock){ 
       value = t; 
       lock.notifyAll(); 
      } 
     } 

     public JSONObject get(){ 
     synchronized(lock){ 
       while(value == null) 
       try { 
        lock.wait(); 
       } catch (InterruptedException e) { 
        return null; 
       } 

       return value; 
     } 

     }  
    } 
+1

すべての厄介なアクセス制御なしで、すべての楽しいシングルトン! – cHao

+1

はい、これはシングルトン(スレッドセーフでないもの、BTW) –

答えて

2

これは、通常は不変でインスタンス間で共有できる事前割り当てオブジェクトを提供するアプローチです。一般的な例はと署名あり

public static final List EMPTY_LIST = new EmptyList<Object>(); 
+0

生のタイプが必要なので、大きな例ではありません。 IIRCでは、JDK8には 'emptySorterSet'がありますが、等価なpublicフィールドはありません。 –

1

これは、Javaでグローバル変数を使用する方法です。 Javaでグローバル変数を直接作成することはできませんが、publicstatic修飾子を使ってもほぼ同じ効果が得られます。グローバルには多くの欠点がありますが、いくつかの利点もあります。私たちは簡単に1か所からデータを交換することができ、それはどこにでも反映されます。つまり、異なるモジュールやクラス間で共通のデータを格納してアクセスすることができます。その間にデータを渡すというハードルはありません。しかし、注意! - :)

+0

です。[可変]グローバルは非常に難しいです。理解不能、テスト容易性、依存性、可搬性、保守性、セキュリティなどにつながる恐ろしいデザイン –

関連する問題