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

сделайте свой конструктор частным, это предотвратит наследование вашего класса другими классами.

или лучший способ создать синглтон-это создать свой класс перечислением с одним перечислением.(Джош Блок)