что-то, что неясно: вы сказали, «итерацию через либо используя для цикла», это означает, что ваш метод получения либо Collection<Obj1>
или Collection<Obj2>
, но не Collection<Object>
, который будет содержать как Obj1
, так и Obj2
? (Мой ответ основывается на приведенном выше предположении)
IMHO, используя адаптер (как предложено в другом ответе), может быть не лучшим выбором для вышеуказанного случая, потому что, если вы проходите в List<Obj1>
, вам необходимо построить List<CustomUnMutableObj1Adapter>
и перейдите к вашему «общему методу обработки», для которого вам по-прежнему нужна куча кода для его обработки, и вы создадите один список адаптеров + один адаптер для каждого элемента для каждого вызова логики процесса, что может быть не очень хорошо.
Конечно, лучший способ решить - ввести общий интерфейс/суперкласс, чтобы дать этим операциям значимую концепцию. Однако, если это не выбор, вы можете увидеть, поможет ли вам следующее.
Один из способов уменьшить код котельной пластины является использование что-то похожее на метод шаблона (Если вы знакомы с Spring, есть много подобного шаблона, как это)
например (Псевдо-код, не компилируется)
interface ProcessInfoExtractor<T> {
int getSize(T entity);
String getLastValue(T entity);
}
выше интерфейс будет нести ответственность, чтобы выполнить «общую» операцию против указанного объекта.
Затем сделайте свой метод обработки, как это:
void <T> process(Collection<? extends T> entities, ProcessInfoExtractor<T> infoExtractor) {
for (T entity : entites) {
System.out.println("size " + infoExtractor.getSize(entity)
+ " last value " + infoExtractor.getLastValue(entity));
}
}
так, когда вам нужно перебирать через в List<Obj1>
, просто сделать:
process(obj1List,
new ProcessInfoExtractor<Obj1> (
@Override
int getSize(Obj1 obj1) { return obj1.getMySize(); }
@Override
String getLastValue(Obj1 obj1) { return obj1.getLastResult(); }
));
(Аналогичный случай для Obj2
)
Для легкость вызова, вы можете сделать 2 метода обертки, которые внутренне вызывают вышеуказанный метод process
, например
void process(Collection<Obj1> obj1List) {
process(obj1List, obj1InfoExtractor); // assume extractor is stateless,
// you can create one and reuse it
};
void process(Collection<Obj2> obj2List) {
process(obj2List, obj2InfoExtractor); // assume extractor is stateless,
// you can create one and reuse it
};
Если имеет смысл сделать это, оба класса реализуют общий интерфейс. – sstan
Я предполагаю, что ваши настоящие имена более приятны, чем 'CustomUnMutableObj1' – immibis