Мне нужна помощь в разработке и реализации шаблона посетителя.
Мы используем тонны 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);
}
}
* * Аналогично тысяча двадцать-один * * 1 022
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();
}
Я знаю, что есть лучший способ сделать это, но я понятия не имею, как я могу использовать Дженерики и Шаблон Посетителя.
Любая помощь приветствуется.
UPDATE
Я хочу добавить, что эти классы являются просто фрагментами гораздо большей реализации.
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);
Saying
[javac] ProcessDataMotorferdsel.java:52: incompatible types
[javac] found : ProcessDataGeneric<ProcessDataMotorferdsel>
[javac] required: ProcessData<ProcessDataCommon>
[javac]
Я не могу сделать заголовки или хвосты этого сообщения об ошибке. Класс ProcessDataMotorferdsel расширяет ProcessDataCommon, поэтому IMO должен работать.