如何在Java中使用从抽象基类型派生的Singleton?

Han*_*etz 11 java inheritance singleton

我有一些用作单身人士的课程.它们共享一些基本功能,并从库中扩展相同的祖先,而库通常不用作单例.

如果我将公共功能放在从公共祖先继承的基类中,我会得到一个实例化没有意义的类,所以我把它变成了抽象的.此外,因为这些类都被用作单例,所以它们都应该有一个init()和一个getInstance()方法,它们都是静态的.所有的建设者当然都是非公开的.

现在,因为static是抽象方法的非法修饰符,以下方法不起作用,尽管这正是我想要的:

class Base extends LibraryClass {
    protected Base() {
        // ... constructor
    }

    // ... common methods

    // ILLEGAL!
    public static abstract void init();
    public static abstract <T extends Base>T getInstance();
}

class A extends Base {
    private static A _INSTANCE;

    private A() {
        super();
    }

    public static void init() {
        _INSTANCE = new A();
    }

    public static A getInstance() {
        return _INSTANCE;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以省略基类中的非法行并完成它.但是,我如何表达Base的每个孩子都必须拥有这些方法?

Aar*_*lla 14

这在Java中是不可能的.static方法的存在不能强制执行; 既不是abstract也不是使用interface.

我的解决方案是以某种方式使用IoC:我为单身人士创建了一个工厂类.它会将单身人士保存在地图中.关键是班级.这样,我可以说:

A singleton = Factory.create (A.class);
Run Code Online (Sandbox Code Playgroud)

这个设计的主要优点是:我可以创建一个Factory.replace()测试用例可以覆盖单例的方法.