Java, разные поля объектов в дочерних классах и как работать с ними наименее болезненным способом

(Отредактировано вниз от большой стены o 'текста, чтобы лучше подвести итог). Проблема заключается в следующем:

У меня есть коллекция AbstractMyClass. В этой коллекции есть ряд конкретных дочерних классов. Каждый дочерний класс также будет содержать поле для определенного типа объекта. Там может быть десяток разных детей AbstractMyClass, каждый со своим полем объектов. У каждого из этих объектов, вероятно, нет общего родительского класса вне объекта.

Например, MyClassA может иметь строку, MyClassB может иметь Integer, MyClassC может иметь MyCustomClass и т.д. Различные объекты являются неудачной необходимостью в том, как это делается.

Дело в том, что эта коллекция должна быть оценена и, учитывая правильный набор условий, объект (объекты) в AbstractMyClass должен быть извлечен, рассмотрен, обработан, сохранен, зарезервирован и т.д. Для последующих операций. Существует множество потенциальных операций, основанных на условиях, а также типа MyClass/object внутри, таких операций, при которых обработка данных в MyClass может быть нецелесообразной, поскольку другие, более централизованные классы (то есть класс, управляющий пулом потоков) могут нужно иметь дело с ними. Это оставляет мне необходимость обрабатывать некоторые очень разрозненные типы объектов. Это, безусловно, можно сделать, но я не могу придумать какой-либо разумно чистый или динамичный способ справиться с этим. Конечно, вы можете попробовать следующее:

  • Используйте Generics, который может исключить некоторые дочерние классы, но вне этого класса вы не знаете, что такое объект T или как его обрабатывать без лишних проблем.
  • Typecheck все, что делает довольно длинным и уродливым условным и должно поддерживаться при введении новых типов объектов.
  • Делегаты в AbstractMyClass, но это означает, что еще больше классов для обработки каждого экземпляра, и делегаты могут не справиться со всеми необходимыми функциями.
  • Объект-оболочка с полем для каждого типа объекта. Да, давайте все проверим.

Вы можете видеть затруднительное положение. Есть ли какой-либо "хороший" способ справиться с подобными вещами или это только одна из тех проблем, с которыми Java не может справиться напрямую, поскольку она может не иметь достаточной информации во время выполнения, и все просто работают вокруг нее разными способами?

1 ответ

Трудно ответить без конкретного примера, не зная точно, что вы должны делать с ответом, но в основном есть два чистых решения OO, которые я вижу.

Первое решение: хороший старый полиморфизм:

public void handleResponse(AbstractResponse response) {
 response.handle();
}

Короче говоря, Ответ сам несет ответственность за его обработку, когда он был получен. Ответ знает свой собственный тип и имеет доступ к собственным данным.

Второе решение: шаблон посетителя, который позволяет экстернализировать обработку ответа, не выполняя проверку экземпляров и отбрасываний, чтобы узнать тип ответа:

public interface ResponseVisitor {
 void visitA(ResponseA responseA);
 void visitB(ResponseB responseB);
}

public abstract class AbstractResponse {
 public abstract void accept(ResponseVisitor visitor);
 ...
}

public class ResponseA extends AbstractResponse {
 @Override
 public void accept(ResponseVisitor visitor) {
 visitor.visitA(this);
 }
}

public class ResponseB extends AbstractResponse {
 @Override
 public void accept(ResponseVisitor visitor) {
 visitor.visitB(this);
 }
}

public class TheResponseVisitorImplementation implements ResponseVisitor {
 @Override
 public void visitA(ResponseA responseA) {
 ...
 }

 @Override
 public void visitB(ResponseB responseB) {
 ...
 }
}

...

public void handleResponse(AbstractResponse response) {
 ResponseVisitor visitor = new TheResponseVisitorImplementation();
 response.accept(visitor);
}

licensed under cc by-sa 3.0 with attribution.