单身合同使用继承?

时间:2017-07-23 01:02:10

标签: java inheritance singleton

我正在尝试创建一个框架,其中Singleton对象可以从中获取其实现的核心。如果我创建多个Singleton类,我就不需要一遍又一遍地重写它们(而简单的)实现。

我试过了:

public abstract class Singleton
{
    protected static final Lock mutex = new ReentrantLock(true);
    // Not even subclasses are allowed to mess with `instance`.
    private static Singleton instance = null;

    // Here is the problem, static methods cannot be abstract.
    protected static abstract Singleton init();

    public static Singleton get()
    {
        mutex.lock();

        // The super class has no idea how to instantiate
        // this singleton, so let subclasses handle that
        // via the abstract init method
        if (instance == null)
            instance = init();

        mutex.unlock();

        return instance;
    }
}

但它真的无法发挥作用,因为static成员继承的整个概念并不顺利。

我的另一个选择是:

public enum Singleton
{
    INSTANCE
}

但由于enum无法扩展,我无法做到:

public enum MySingleton extends Singleton
{
    // Member variables and functions here
    ...
}

我可以让每个实现只是一个enum并且我必须重复的唯一代码(我认为?)是INSTANCE,除非我遗漏了什么?我看到的唯一缺点是Singleton是在运行时开始时创建的,而不是稍后在程序中按需创建。

我也可以做一个界面,但后来我被困在这里:

public interface Singleton
{
    Singleton instance = null;

    default void set(Singleton s)
    {
        assert instance == null;
        assert s != null;
        // cannot do this, as `instance` is FINAL
        instance = s;
    }
}

在不必重新键入整个实现的情况下,定义Singleton合约的最佳方法是什么?

由于

0 个答案:

没有答案