我需要帮助来生成和实现访问者模式。我们正在使用大量,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
andProcessDataGeneric
是代表之外的东西(等等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 它应该可以工作。