我有以下类层次结构:
<code>
public interface Decorator <T> {
T decorate(String data);
}
public class StringDecorator implements Decorator<String> {
@Override
public String decorate(String data) {
return "Decorated Data";
}
}
public class IntegerDecorator implements Decorator<Integer> {
@Override
public Integer decorate(String data) {
return 0;
}
}
public class MyPrint {
public void printData(String data) {
System.out.println("String Data: " + data);
}
public void printData(Integer data) {
System.out.println("Integer Data: " + data);
}
}
</code>
有了上面的结构,我想首先调用一些装饰器函数并将相同的结果传递给printData方法。我可以在java反射的帮助下实现这一点,如下所示:
<code>
void callerFunction(Decorator decorator, MyPrint myPrint){
// Below line would call appropriate decorator depending on injected type
Object decoratedData = decorator.decorate("test");
try {
// Java reflection to figure out an appropriate overloaded method to be invoked
myPrint.getClass().getMethod("printData", decoratedData.getClass()).invoke(myPrint, decoratedData);
} catch (Exception e) {
e.printStackTrace();
}
}
</code>
有没有更好的方法来实现相同而不使用反射?用例是根据装饰器返回的数据类型调用适当的printData重载函数(不使用instanceOf上的if else)。
感谢。
答案 0 :(得分:0)
我可以想到两个解决方案。
首先,您无需担心重载printData,而是依赖于在每个类中定义合适的toString方法:
public void printData(Object data) {
System.out.println("Data: " + data);
}
其次,您可以使用泛型定义打印数据方法,例如在每个装饰器中
public interface Decorator <T> {
T decorate(String data);
void printData(T object);
}
或者等效地你可以定义一个单独的printData接口,然后你的装饰器类也需要创建一个相应的printData类。