繁体   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