Я хочу иметь абстрактный класс, скажем Foo, который предоставляет набор API, которые будут реализованы подклассами. Но я не хочу, чтобы кто-нибудь знал, что является фактическим экземпляром этого подкласса, только чтобы их можно было восстановить с помощью статических методов Foo. Примерно такие классы будут выглядеть так:Зарегистрировать различные реализации класса
class Foo {
protected Hashtable foos = new Hashtable;
public static Foo getFoo(String key) {
return (Foo) foos.get(key);
}
public abstract void doSomething();
}
class FooA extends Foo {
static {
Foo.foos.put("A", new FooA());
}
public void doSomething() {
System.out.println("A FooA instance is doing something!!");
}
}
class FooB extends Foo {
static {
Foo.foos.put("B", new FooB());
}
public void doSomething() {
System.out.println("A FooB instance is doing something!!");
}
}
И использование было бы следующее:
Foo foo = Foo.get("A");
foo.doSomething();
Проблема с этим состоит в том, что, так как FooA и FooB не используются непосредственно в любом месте, в классах не загружен, а статический блок не выполняется. Я мог бы загружать их явно во многих отношениях, но дело в том, чтобы иметь «неизвестные» множественные реализации.
Некоторые могут подумать, что решение состоит в том, чтобы не иметь неизвестных реализаций, но это действительно требование моей проблемы.
Считаете ли вы использование 'Class.forName' для загрузки ваших подклассов? –