我需要帮助来生成和实现访客模式。
我们正在使用大量的instanceof
,这很痛苦。我敢肯定它可以修改,但是我不确定该怎么做。
基本上我们有一个接口ProcessData
public interface ProcessData {
public setDelegate(Object delegate);
public Object getDelegate();
//I am sure these delegate methods can use generics somehow
}
现在我们有一个实现
ProcessDataGeneric
的类ProcessData
public class ProcessDataGeneric implements ProcessData {
private Object delegate;
public ProcessDataGeneric(Object delegate) {
this.delegate = delegate;
}
}
现在,一个新的接口检索ProcessData
interface ProcessDataWrapper {
public ProcessData unwrap();
}
现在,一个通用的抽象类实现了包装器,因此可以检索ProcessData
@XmlSeeAlso( { ProcessDataMotorferdsel.class,ProcessDataTilskudd.class })
public abstract class ProcessDataCommon implements ProcessDataWrapper {
protected ProcessData unwrapped;
public ProcessData unwrap() {
return unwrapped;
}
}
现在执行
public class ProcessDataMotorferdsel extends ProcessDataCommon {
public ProcessDataMotorferdsel() {
unwrapped = new ProcessDataGeneric(this);
}
}
类似地
public class ProcessDataTilskudd extends ProcessDataCommon {
public ProcessDataTilskudd() {
unwrapped = new ProcessDataGeneric(this);
}
}
现在,当我使用这些类时,我总是需要做
instanceof
ProcessDataCommon pdc = null;
if(processData.getDelegate() instanceof ProcessDataMotorferdsel) {
pdc = (ProcessDataMotorferdsel) processData.getDelegate();
} else if(processData.getDelegate() instanceof ProcessDataTilskudd) {
pdc = (ProcessDataTilskudd) processData.getDelegate();
}
我知道有更好的方法可以做到这一点,但是我不知道如何利用泛型和访客模式。
任何帮助是极大的赞赏。
更新
我想补充一点,这些类只是更大的实现的片段。
ProcessData
和ProcessDataGeneric
在委托之外(ProcessDataMotorferdsel
等)。代表都扩展了ProcessDataCommon
。我可以同意重构可能是最好的选择,但这是2年的生产代码,并且重构成本很高(时间,测试等)。但是,我愿意这样做。
更新#2
我试图启动通用进程,但是却遇到编译错误。这就是现在的样子。
public interface ProcessData<T extends ProcessDataCommon> {
T getDelegate();
setDelegate(T delegate);
}
public class ProcessDataGeneric<T extends ProcessDataCommon> implements ProcessData<T> {
private T delegate;
//Getter & setter
public ProcessDataGeneric(T delegate) {
this.delegate = delegate;
}
}
public class ProcessDataMotorferdsel extends ProcessDataCommon {
public ProcessDataMotorferdsel() {
unwrapped = new ProcessDataGeneric<ProcessDataMotorferdsel>(this);
}
}
我在行上得到编译错误:
unwrapped = new ProcessDataGeneric<ProcessDataMotorferdsel>(this);
说[javac] ProcessDataMotorferdsel.java:52: incompatible types [javac] found : ProcessDataGeneric<ProcessDataMotorferdsel> [javac] required: ProcessData<ProcessDataCommon> [javac]
我无法使该错误信息出现正面或反面。 ProcessDataMotorferdsel类扩展了ProcessDataCommon,因此IMO应该可以使用。
最佳答案
也许我也想念一些东西,但是
ProcessDataCommon pdc = null;
if(processData.getDelegate() instanceof ProcessDataCommon) {
pdc = (ProcessDataCommon) processData.getDelegate();
}
应该等效..?如您所述,委托始终是
ProcessDataCommon
类型。如果
ProcessData#getDelegate()
然后返回ProcessDataCommon
,则也可以消除其余的instanceof
检查。