我想创建一组共享许多常见行为的类。当然在OOP中你认为你自动认为“带有子类的抽象类”。但是我希望这些类要做的事情是每个类都有一个静态的类实例列表。该列表应该在类中作为单个类的一种运行。我的意思是每个子类都有一个单例,而不是它们共享一个。 “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();
每个子类的列表内容会有所不同,但列表上的所有代码都是相同的。
上面代码的问题是我只有一个列表用于所有子类,我想要一个列表。是的,我可以复制代码来在每个子类中声明静态列表,但是我还必须复制添加到列表中的所有代码并搜索列表等,这相当违背了子类化的目的。
有关如何在不复制代码的情况下执行此操作的任何想法?
更新
为了澄清BlueRaja以及其他人,让我对我正在尝试做的事情稍微具体一点。
我有许多需要类似行为的状态和代码。它们就像枚举一样,我希望每个可能的代码状态都有类型安全的实例,但是它们有多个集合,所以我不能只为它们创建一个枚举。
例如,我有订单状态,它具有按订单,已发货,已收货和某些特殊值的值。我有项目类型,商品与服务的价值。我有股票与定制。等
如果就是这样的话,我只会为每个人制作一个枚举。但是我还需要其他行为,例如通过文本值查找对象的能力,例如:当我们从数据库中读取它时;建立一个下拉列表,通过文字描述列出所有选择;据我所知,我不能用枚举来做这个,因为我有几组代码,每个代码都有我想要继承的常见行为,而且我不能继承枚举。将所有代码放在一个枚举中会放弃一个代码与另一个代码的类型安全性,并且没有现成的方法来收集特定代码类型的值列表。
答案 0 :(得分:5)
您可以在父类中使用static Map<Class, YourClass> = new ConcurrentHashMap<..>()
并使用该地图添加/检索实例。
尽管对单身人士的这种大规模依赖听起来像是一个糟糕的设计 - 你应该尽量避免它。
答案 1 :(得分:1)
What is so bad about singletons?
编辑:回答问题后: 你说“我想创建一组共享许多常见行为的类” - 对我而言,并不建议“带有子类的抽象类”,因为抽象类没有行为。它建议实现共同行为的单独对象,以及聚合该单独对象的许多类。
答案 2 :(得分:0)
从它的声音来看,你真正想要的是一个带有自定义属性和behaviours的枚举类。有关Java中枚举极端功能的示例,请参阅here。
答案 3 :(得分:0)
我会考虑一种工厂方法:
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
方法。
答案 4 :(得分:0)
你可以使用类的索引,静态列表不需要你可以只使用引用这些类的cors和子类的instace的索引。 这是一个例子: http://www.java2s.com/Code/CSharp/Class-Interface/Indexerallowarraylikeindex.htm
答案 5 :(得分:0)
如果您需要单例功能并且同时希望获得继承的好处,您应该考虑依赖注入框架,例如 Spring 或 PicoContainer 。即使您的应用程序非常小,使用框架管理依赖项也会让您的生活更轻松。