【发布时间】:2023-03-07 23:12:01
【问题描述】:
我有以下类层次结构:
<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)。
谢谢。
【问题讨论】:
-
这肯定不是装饰器的正确实现,但好消息是,这个问题不需要装饰器。
-
可能是访客的工作。
-
是的,那里的命名约定可能不好。假设上述问题中的装饰器层次结构实际上以一种或另一种方式处理数据。可能是某种处理器。
标签: java reflection overloading