У меня есть некоторые классы, которые используются как синглтоны. Они имеют некоторые базовые функции и расширяют один и тот же предк из библиотеки, которая, в свою очередь, обычно не используется как 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;
}
}
Я мог бы просто оставить незаконные строки в базовом классе и сделать с ним. Но как я могу выразить, что каждый ребенок базы должен иметь эти методы?