【问题标题】:Static/Final java classes?静态/最终java类?
【发布时间】:2011-06-02 22:33:17
【问题描述】:

我想在我的父类的任何扩展类上强制实现单例模式。也就是说,我只希望每个子类都有一个实例(可通过 Child.INSTANCE 或类似的东西访问)。

理想情况下,我希望创建 Child.INSTANCE 对象,然后不创建 Parent 类型的其他对象。

目前我通过以下方式获取我的实例:

public class Child extends Parent {
    public static final Child INSTANCE = new Child();
    ....

我想知道,Java 类可以以某种方式设为静态或其他什么吗?

谢谢=]

【问题讨论】:

  • 回答部分问题:内部类可以设为静态;至于问题的其余部分,我不完全确定您正在寻找的东西是否可以完成
  • 您是想在继承树中拥有每个类的单个实例,还是在整个树中只拥有一个类?
  • 谢谢,不过我知道这一点。不幸的是,这会使我的课程过长——而且我认为我必须让 Parent 成为一个静态的内部......
  • 这样做的目的是什么?可能有比尝试强制每个子类成为单例更好的设计。
  • @Jonathan 继承树中每个类的单个实例。 @jzd 这只是为了忠于状态模式,现有代码的某些部分( =[ )取决于他们看到的 Child 实例是唯一的这一事实。

标签: java singleton instance-variables


【解决方案1】:

您的子类的集合是固定的吗?如果是这样,请考虑使用enum

public enum Parent {
    CHILD1 {
        // class definition goes here
    },

    CHILD2 {
        // class definition goes here
    };

    // common definitions go here
}

由于OP提到了状态模式,这里有两个基于enum的状态机示例:a simple onea complex one

【讨论】:

  • 一组我预计会很大并且会长大的孩子
  • @Dartoxian:是的,但是它需要在运行时增长,还是允许重新编译?如果是后者,这还是合适的。
  • 是的,重新编译将会发生。感谢您的链接 - 它看起来像一个非常有用的指针 =]
【解决方案2】:

可以做到,但我不明白这一点。恕我直言,您最好使用枚举。

enum {
  Singleton, 
  Child { /* override methods here * }
}

但是要回答您的问题,您可以执行以下操作

class SingletonParent {
   private static final Set<Class> classes = new CopyOnArraySet();
   { if (!classes.add(getClass()) throw new AssertionError("One "+getClass()+" already created."); }
}

【讨论】:

    【解决方案3】:

    您正在查看错误的设计模式。

    看看工厂模式。工厂可以创建一个类的单个实例,然后将其分发给任何需要它的人。工厂可以分发父母的单身人士、任何孩子或任何你想要的东西。

    【讨论】:

      【解决方案4】:

      您可以使用 Java enum。基本上它创建了一堆公共静态类(就像你做的那样),但对它们施加了一些限制。

      public enum Child {
         INSTANCE;
      }
      

      请注意,enums 是完整的类,因此您可以根据需要轻松地为每个实例添加方法。

      【讨论】:

        【解决方案5】:

        我会用question 来回答,我不久前问过这个问题非常相似。我相信这会做你想做的事,但会附带答案中提到的所有限制。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-24
          • 2013-06-19
          相关资源
          最近更新 更多