代码之家  ›  专栏  ›  技术社区  ›  Jay

我怎样才能成为单身家庭?

  •  1
  • Jay  · 技术社区  · 14 年前

    我想创建一组共享很多公共行为的类。当然,在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和其他人澄清,让我更具体地说明一下我在做什么。

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

    例如,我有订单状态,它有订单、发货、接收和一些特殊值的值。我有商品类型,商品和服务的值。我有存货和定制。等。

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

    6 回复  |  直到 14 年前
        1
  •  5
  •   Bozho Michał Mech    14 年前

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

    尽管如此巨大的单件依赖听起来像是一个糟糕的设计-你应该尽量避免它。

        2
  •  1
  •   Community Egal    7 年前

    What is so bad about singletons?

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

        3
  •  0
  •   Community Egal    7 年前

    从听起来,您真正想要的是一个具有自定义属性和 behaviours . 见 here 举一个Java中枚举极值的例子。

        4
  •  0
  •   extraneon    14 年前

    我会想到一个工厂方法:

    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 当然,方法已经不复存在了。

        5
  •  0
  •   Harold Sota    14 年前

    您可以使用类的索引,静态列表不需要您可以只使用引用这些CORS类和子类实例的索引。 以下是一个示例: http://www.java2s.com/Code/CSharp/Class-Interface/Indexerallowarraylikeindex.htm

        6
  •  0
  •   wax    14 年前

    如果您需要单例功能,同时希望获得继承的好处,那么应该考虑依赖注入框架,例如 春天 微型集装箱 . 即使您的应用程序非常小,使用一个管理依赖关系的框架,您的生活也会更轻松。