Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我怎样才能组建一个单身家庭?_Java_Design Patterns_Oop_Singleton - Fatal编程技术网

Java 我怎样才能组建一个单身家庭?

Java 我怎样才能组建一个单身家庭?,java,design-patterns,oop,singleton,Java,Design Patterns,Oop,Singleton,我想创建一组共享许多常见行为的类。当然,在OOP中,当你认为你自动地想到“带有子类的抽象类”时。但我希望这些类做的其中一件事是每个类都有一个类实例的静态列表。该列表应该在类中作为一个单例。我的意思是每个子类都有一个单例,而不是说它们共享一个单例。“Singleton”到该子类,而不是真正的Singleton。但是如果它是静态的,我如何继承它呢 当然,这样的代码是行不通的: public abstract A { static List<A> myList; public st

我想创建一组共享许多常见行为的类。当然,在OOP中,当你认为你自动地想到“带有子类的抽象类”时。但我希望这些类做的其中一件事是每个类都有一个类实例的静态列表。该列表应该在类中作为一个单例。我的意思是每个子类都有一个单例,而不是说它们共享一个单例。“Singleton”到该子类,而不是真正的Singleton。但是如果它是静态的,我如何继承它呢

当然,这样的代码是行不通的:

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();
公共摘要A
{
静态列表;
公共静态列表getList()
{
if(myList==null)
myList=新阵列列表(10);
返回myList;
}
公共静态A getSomethingFromList()
{
List listInstance=getList();
…用列表做一些事情。。。
}
public int getSomethingFromA()
{
…针对当前实例执行操作的常规代码。。。
}
}
公共类A1扩展了
{
...
}
公共类A2扩展了
{
...
}
A1 somethingfromA1List=(A1)A1.getSomethingFromList();
A2 somethingfromA2List=(A2)A2.getSomethingFromList();
每个子类的列表内容会有所不同,但处理列表的所有代码都是相同的

上面代码的问题是,我对所有子类只有一个列表,而我希望每个子类都有一个列表。是的,我可以复制代码来声明每个子类中的静态列表,但是我还必须复制所有添加到列表和搜索列表的代码,等等,这与子类化的目的背道而驰

关于如何在不复制代码的情况下做到这一点,有什么想法吗

更新

为了向BlueRaja和其他人澄清,让我更具体地说明我正在尝试做什么

我有许多需要类似行为的状态和代码。它们类似于枚举,因为我希望每个可能的代码状态都有类型安全的实例,但它们有多个集合,所以我不能只为它们创建一个枚举

例如,我有order status,它有on order、shipped、received和一些特殊值。我有物品类型,有商品和服务的价值。我有存货和海关。等等


如果这就是全部的话,我会为每一个做一个枚举。但我还需要其他行为,比如通过文本值查找对象的能力,例如,当我们从数据库中读取对象时;构建一个下拉列表,通过文本描述列出所有选项;等等。就我所知,我不能用枚举来做这件事,因为我有几组代码,每个代码都有我想要继承的常见行为,而且我不能对枚举进行子类化。将所有代码放在一个枚举中会放弃一个代码相对于另一个代码的类型安全性,并且证明没有现成的方法来收集特定代码类型的值列表。

您可以在父类中使用
静态映射=new ConcurrentHashMap()
,并使用该映射添加/检索实例


尽管如此依赖单例在我看来是一个糟糕的设计,但您应该尽量避免它。

您可以在父类中使用一个
静态映射=new ConcurrentHashMap()
,并使用该映射添加/检索实例

尽管如此依赖单身人士在我看来是个糟糕的设计,但你应该尽量避免它。

编辑:在回答问题后: 你说“我想创建一组具有许多共同行为的类”——对我来说,这并不意味着“抽象类和子类”,因为抽象类没有行为。它建议使用一个单独的对象来实现公共行为,并使用许多类来聚合该单独的对象。

编辑:在回答问题后:
你说“我想创建一组具有许多共同行为的类”——对我来说,这并不意味着“抽象类和子类”,因为抽象类没有行为。它建议使用一个实现常见行为的单独对象,以及许多聚合该单独对象的类。

从它的发音来看,您真正想要的是一个具有自定义属性和属性的枚举类。有关Java中枚举的强大功能的示例,请参见。

从它的发音来看,您真正想要的是一个具有自定义属性和属性的枚举类。有关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; }
}
公共类工厂{
私有静态最终A1实例=新A1(
Collections.synchronizedList(新的ArrayList(100));
私有静态最终A2实例=新A2(
Collections.synchronizedList(新的ArrayList(100));
public static A getA1(){return a1Instance;}
公共静态A getA2(){return a2Instance;}
}

当然,您的A不再需要所有这些
静态
方法。

我会考虑工厂方法:

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; }
}
公共类工厂{
私有静态最终A1实例=新A1(
Collections.synchronizedList(新的ArrayList(100));
私有静态最终A2实例=新A2(
Collections.synchronizedList(新的ArrayList(100));
public static A getA1(){return a1Instance;}
公共静态A getA2(){return a2Instance;}
}

当然,你的A不再需要所有这些
静态
方法。

你可以使用类的索引,静态列表不需要你,你可以只使用引用这些COR类和子类的instace的索引。 这里有一个例子:
您可以使用类的索引,静态列表不需要您,只需使用引用这些cors类和子类的instance的索引即可。 这里有一个例子:

< p>如果您需要一个单独的功能,同时希望继承的好处,您应该考虑依赖注入框架,如<强> Spring < /St>或<强> PICoCube