Java singleton с наследованием
у меня есть набор одноэлементных классов, и я хочу избежать шаблонного кода. Вот что у меня теперь:
public class Mammal {
protected Mammal() {}
}
public class Cat extends Mammal {
static protected Cat instance = null;
static public Cat getInstance() {
if (null == instance) {
instance = new Cat();
}
return instance;
}
private Cat() {
// something cat-specific
}
}
это работает, и в этом нет ничего плохого, за исключением того, что у меня много подклассов Mammal
это должно реплицировать getInstance()
метод. Я бы предпочел что-то вроде этого, если можно:
public class Mammal {
protected Mammal() {}
static protected Mammal instance = null;
static public Mammal getInstance() {
if (null == instance) {
instance = new Mammal();
}
return instance;
}
}
public class Cat extends Mammal {
private Cat() {
// something cat-specific
}
}
как мне это сделать?
3 ответов
вы не можете, так как конструкторы не наследуются и не переопределяются. The new Mammal()
в вашем желаемом примере создается только Mammal
, а не один из его подклассов. Я предлагаю вам посмотреть на заводской образец или перейти к чему-то вроде весны, которая предназначена именно для этой ситуации.
можно использовать enum
для создания синглтонов.
public enum Mammal {
Cat {
// put custom fields and methods here
}
}
сделайте свой конструктор частным, это предотвратит наследование вашего класса другими классами.
или лучший способ создать синглтон-это создать свой класс перечислением с одним перечислением.(Джош Блок)