Статические / Заключительные классы Java? - PullRequest
4 голосов
/ 03 января 2011

Я хочу принудительно реализовать шаблон синглтона в любом из расширенных классов моего родительского класса.То есть я хочу, чтобы был только один экземпляр каждого дочернего класса (доступный через Child.INSTANCE или что-то в этом роде).

В идеале я хотел бы, чтобы объект Child.INSTANCE создавался, а затем никакой другой объект типа Parent не будет создан.

В настоящее время я получаю свои экземпляры через что-то вроде:

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

Интересно, можно ли сделать класс Java статическим или что-то в этом роде?каким-то образом?

Спасибо =]

Ответы [ 5 ]

9 голосов
/ 03 января 2011

Исправлен ли набор ваших дочерних классов? Если это так, рассмотрите возможность использования enum.

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

    CHILD2 {
        // class definition goes here
    };

    // common definitions go here
}

Так как OP упоминал о шаблоне состояний, вот два примера машин состояний на основе enum: простой и сложный .

1 голос
/ 03 января 2011

Вы смотрите на неправильный шаблон дизайна.

Взгляните на шаблон Factory.Фабрика может создать один экземпляр класса, а затем раздать его любому, кто захочет.Фабрика может раздать один родительский элемент, любого ребенка или что-либо еще, что вы хотите.

1 голос
/ 03 января 2011

Это можно сделать, но я не вижу смысла.Вам лучше использовать перечисление IMHO.

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."); }
}
0 голосов
/ 03 января 2011

Я отвечу вопросом Я недавно спросил, что было очень похоже.Я считаю, что это будет делать то, что вы хотите, но идет со всеми ограничениями, упомянутыми в ответах.

0 голосов
/ 03 января 2011

Вы можете использовать Java enum.По сути, он создает несколько открытых статических классов (как и вы), но накладывает на них несколько ограничений.

public enum Child {
   INSTANCE;
}

Обратите внимание, что enums - это полные классы, поэтому вы можете легко добавлять методы наЭкземпляр базы, если вы хотите.

...