带有继承的Java单例

时间:2011-06-10 15:55:25

标签: java inheritance singleton code-formatting

我有一组单例类,我想避免使用样板代码。这就是我现在所拥有的:

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 个答案:

答案 0 :(得分:3)

你不能因为构造函数既不是继承的也不是可覆盖的。您所需示例中的new Mammal()仅创建Mammal,而不是其子类之一。我建议你看一下Factory模式,或者去看一下像Spring这样的东西。

答案 1 :(得分:3)

您可以使用enum创建单身人士。

public enum Mammal {
    Cat {
        // put custom fields and methods here
    }
}

答案 2 :(得分:0)

将您的构造函数设为私有,这将阻止您的类被其他类继承。

创建单例的最佳方法是使用一个枚举创建一个包含枚举的类。(Josh Block)