簡體   English   中英

如何建立單身家庭?

[英]How can I make a family of singletons?

我想創建一組共享許多常見行為的類。 當然,在OOP中,當您認為自己會自動想到“帶有子類的抽象類”時。 但是我希望這些類要做的事情之一是每個類都有一個靜態的類實例列表。 該列表應作為類中的一個單例。 我的意思是每個子類都有一個單例,而不是它們共享一個。 該子類的“單例”,不是真正的單例。 但是,如果它是靜態的,我該如何繼承呢?

當然,這樣的代碼是行不通的:

public abstract A
{
  static List<A> myList;
  public static List getList()
  {
    if (myList==null)
      myList=new ArrayList<A>(10);
    return myList;
  }
  public static A getSomethingFromList()
  {
    List listInstance=getList();
    ... do stuff with list ...
  }
  public int getSomethingFromA()
  {
    ... regular code acting against current instance ...
  }
}
public class A1 extends A
{
  ...
}
public class A2 extends A
{
   ...
}

A1 somethingfromA1List=(A1) A1.getSomethingFromList();
A2 somethingfromA2List=(A2) A2.getSomethingFromList();

每個子類的列表內容將有所不同,但是在列表上使用的所有代碼都將相同。

上面的代碼的問題在於,對於所有子類,我只有一個列表,而每個子類都想要一個。 是的,我可以復制代碼以在每個子類中聲明靜態列表,但是隨后我還必須復制添加到列表中的所有代碼並搜索列表等,這違背了子類化的目的。

關於如何在不復制代碼的情況下執行此操作的任何想法?

更新資料

為了澄清BlueRaja以及其他問題,讓我更具體地說明我要做什么。

我有許多需要類似行為的狀態和代碼。 它們就像枚舉,因為我希望每種可能的代碼狀態都具有類型安全的實例,但是它們存在多個集合,所以我不能僅對它們全部做一個枚舉。

因此,例如,我有一個訂單狀態,其中包含有關訂單,運送,接收和一些特殊值的值。 我有商品類型,其中包含商品與服務的價值。 我有現貨還是定制的。 等等。

如果僅此而已,我將為每個對象做一個枚舉。 但是我還需要其他行為,例如通過文本值查找對象的能力,例如,當我們從數據庫中讀取對象時; 建立一個下拉列表,通過文字描述列出所有選擇; 就我所知,我無法使用枚舉來執行此操作,因為我有幾組代碼,每個代碼都具有我想繼承的常見行為,因此我無法將枚舉歸為子類。 將所有代碼放在一個枚舉中將放棄一種代碼相對於另一種代碼的類型安全性,並證明沒有現成的方法來收集特定代碼類型的值列表。

您可以在父類中使用static Map<Class, YourClass> = new ConcurrentHashMap<..>() ,並使用該映射來添加/獲取實例。

盡管對單例的如此大的依賴對我來說聽起來像是一個糟糕的設計-但您應該避免這樣做。

單身人士有什么不好呢?

編輯:在一個問題答復之后:您說“我想創建一組共享許多共同行為的類” –對我來說,這根本不建議“抽象類帶有子類”,因為抽象類沒有行為。 它建議使用一個單獨的對象來實現共同的行為,並建議使用許多類來聚合該單獨的對象。

從它的聲音來看,您真正想要的是一個具有自定義屬性和行為的枚舉類。 有關Java枚舉的強大功能的示例,請參見此處

我會想到一種工廠方法:

public class Factory {
  private static final A1 a1Instance = new A1(
          Collections.synchronizedList(new ArrayList<something>(100)));
  private static final A2 a2Instance = new A2(
          Collections.synchronizedList(new ArrayList<something>(100)));

  public static A getA1() { return a1Instance; }
  public static A getA2() { return a2Instance; }
}

當然,您的A不再需要所有這些static方法。

您可以使用類的索引,不需要靜態列表,只需使用引用這些cors類和子類實例的索引即可。 這是一個示例: http : //www.java2s.com/Code/CSharp/Class-Interface/Indexerallowarraylikeindex.htm

如果您需要單例功能,同時又想從繼承中受益,則應考慮使用依賴注入框架,例如SpringPicoContainer 即使您的應用程序很小,使用框架管理依賴項,您的生活也會變得更加輕松。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM