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