我正在尝试创建一个框架,其中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合约的最佳方法是什么?
由于