Java синглтон с наследованием - PullRequest
8 голосов
/ 10 июня 2011

У меня есть набор одноэлементных классов, и я хочу избежать стандартного кода.Вот что у меня сейчас:

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 ]

3 голосов
/ 10 июня 2011

Вы можете использовать enum для создания синглетонов.

public enum Mammal {
    Cat {
        // put custom fields and methods here
    }
}
3 голосов
/ 10 июня 2011

Вы не можете, так как конструкторы не наследуются и не переопределяются. new Mammal() в вашем желаемом примере создает только Mammal, а не один из его подклассов. Я предлагаю вам взглянуть на шаблон Factory или перейти на что-то вроде Spring, предназначенное именно для этой ситуации.

0 голосов
/ 10 июня 2011

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

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

...