2010-05-03 82 views
1

我想创建一组共享许多常见行为的类。当然,在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,也许别人,让我成为一个更具体一点什么,我试图做的。

我有一些需要类似行为的状态和代码。它们就像枚举一样,我希望为每个可能的代码状态提供类型安全的实例,但是它们有多个集合,所以我不能只为它们制作一个枚举。

因此,例如我有订单状态,它具有按顺序,发货,收到的值和一些特殊值。我有物品类型,商品与服务的价值。我有股票与习俗。等

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

+2

不要在对象orietented世界中使用静态持有状态,这只是错误的。 – 2010-05-03 13:53:10

+2

不要使用单例,对静态数据要非常小心。比继承更喜欢构图。 真的,你提到的几乎没有什么是真正的“良好的面向对象”。 – jalf 2010-05-03 14:00:32

+0

好的。所以我有一组给定子类的实例,并且我需要维护一个所有这些实例的列表以供搜索,构建下拉列表等。好的,我可以创建一个包含列表的(非静态)对象。但只有一个列表才有意义。那有什么好处呢?如果我用不同的列表创建两个对象,那么有些事情是错误的。如果没有单身人士,你会如何解决问题? – Jay 2010-05-03 16:48:45

回答

5

您可以在父类中使用static Map<Class, YourClass> = new ConcurrentHashMap<..>()并使用该映射来添加/检索实例。

虽然如此大的依赖单身人士听起来像一个糟糕的设计 - 你应该尽量避免它。

+0

这个问题的答案是:子类中的静态如何从HashMap中抽取适当的条目?我看到这样做的唯一方法是将静态放在超类中,并将类名作为参数传递,如“A1 a1 =(A1)A.getSomethingFromA(A1.class)”。可以,但有点尴尬。你有没有更简单的方法? – Jay 2010-05-04 01:30:34

1

What is so bad about singletons?

编辑:一个问题的回答后: 你说“我要创建一组共享很多共同行为的类” - 这对我来说,不建议“与子类的抽象类完全“,因为抽象类没有行为。它提出了一个实现常见行为的单独对象,以及许多聚合该单独对象的类。

+0

好的。那么如果没有一个单身人士,你会如何解决这个问题? – Jay 2010-05-03 16:37:00

+0

你说“我想创建一系列共享许多共同行为的类” - 对我来说,*不会*提供“具有子类的抽象类”,因为抽象类没有行为。它提出了一个实现常见行为的单独对象,以及许多聚合该单独对象的类。 – 2010-05-04 07:15:49

0

从它的声音,你真正想要的是一个具有自定义属性的枚举类和behaviours。有关Java中枚举的强大功能的示例,请参阅here

+0

是的,这是真的,我想要的东西就像一个精心制作的枚举。但是我想要数十个课程,并且有相同的阐述。据我所知,我不能继承一个枚举。所以是的,我可以通过使用相同代码制作一大堆枚举来实现这一点。但是复制粘贴代码是一个维护噩梦。除非有一种方法来枚举枚举,否则这不会为我在这里削减。 – Jay 2010-05-03 14:25:31

+0

@Jay:不,你想要一个* single *枚举类,不涉及子类。现在你使用类的每件事实际上都是一个枚举值。每个“类”的自定义行为实际上是一个抽象枚举方法的实现,它针对每个枚举值。与其他任何课程一样,共享的任何东西都只是枚举的一部分。不会涉及复制/粘贴 - 你所描述的情况完全是Java的强大枚举。 – 2010-05-03 14:30:22

+0

我认为你误解了我的要求。 (或者我误解了你。)我将原始问题更新为更具体,也许这会澄清。 – Jay 2010-05-03 16:26:30

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; } 
} 

你一个不会需要所有这些static方法了,当然。

0

如果你需要一个单独的功能,并在同一时间想继承的好处,你应该考虑依赖注入框架如春PicoContainer的。即使您的应用程序非常小,使用框架管理依赖关系仍然会让您的生活更轻松。