假设有一个基类Base和几个继承自Base的子类Sub1、Sub2等,每个子类都会把自己的实例注入到一个静态的Map中。
首先,定义基类和子类:
public class Base {
// 抽象方法,子类需要实现
public void doSomething() {
throw new UnsupportedOperationException("Should be implemented in subclasses");
}
}
public class Sub1 extends Base {
@Override
public void doSomething() {
// 实现具体的操作
}
public static final String TYPE = "Sub1";
public Sub1() {
// 注册自己到静态Map中
Registry.register(TYPE, this);
}
}
public class Sub2 extends Base {
@Override
public void doSomething() {
// 实现具体的操作
}
public static final String TYPE = "Sub2";
public Sub2() {
// 注册自己到静态Map中
Registry.register(TYPE, this);
}
}
然后,定义用于注册实例的Registry类:
import java.util.HashMap;
import java.util.Map;
public class Registry {
private static final Map<String, Base> registry = new HashMap<>();
public static void register(String type, Base instance) {
registry.put(type, instance);
}
public static Base getInstance(String type) {
return registry.get(type);
}
}
最后,可以根据类型来获取对应的实例并调用方法:
public class Main {
public static void main(String[] args) {
Base sub1 = Registry.getInstance("Sub1");
Base sub2 = Registry.getInstance("Sub2");
if (sub1 != null) {
sub1.doSomething();
}
if (sub2 != null) {
sub2.doSomething();
}
}
}
这个例子中,我们定义了一个基类Base和两个子类Sub1和Sub2。每个子类在构造时会把自己注册到Registry的静态map中,并提供了一个doSomething的实现。然后,我们可以通过Registry来获取对应类型的实例并调用它们的方法。这个例子展示了如何根据类型自动调用对应子类的方法,而无需手动判断类型并进行类型转换。