У меня есть этот класс, на котором у меня есть метод, и он вернет карту, используя в ней десятки методов, используя те же аргументы.
В моем классе тысячи строк, и это будет еще больше.
Я могу создать несколько классов и внутри методов создания, но я спрашиваю, есть ли специальный сценарий для этого сценария
Фактический сценарий:
public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {
Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);
lastMap = do1(firstMap, lastMap);
lastMap = do2(firstMap, lastMap);
lastMap = do3(firstMap, lastMap);
lastMap = do4(firstMap, lastMap);
//more 20 methods
return lastMap;
}
Фактический сценарий:
public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {
Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);
Do1 do1 = new Do1();
lastMap = do1.do1(firstMap, lastMap);
Do2 do2 = new Do2();
lastMap = do2.do2(firstMap, lastMap);
// more 20 methods
return lastMap;
}
Почему бы не использовать более функциональный подход?
определить интерфейс
interface MapTransformation{
void transformation(Map<String, Object> first, Map<String, Object> last);
}
, тогда при создании класса класс, имеющий определение transformMapOnAnotherMap, принимает список преобразований как параметр то вы можете сделать
class SomeClass {
final private List<MapTransformation> transformations;
//constructor omitted
public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {
Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);
transformations.forEach(t->t.transformation(firstMap,lastMap);
return lastMap;
}
}
Если do1 и т. д. - это просто реализация, а не часть открытого интерфейса вашего класса, вероятно, имеет смысл создать частный класс (возможно, даже вложенный) с конструктором, принимающим две карты, которые он сохраняется как переменные экземпляра:
private static class Worker {
Worker(Map firstMap, Map secondMap) {
this.firstMap = firstMap;
this.secondMap = secondMap;
}
void do1() {
// ...update `this.lastMap` if appropriate...
}
void do2() {
// ...update `this.lastMap` if appropriate...
}
}
Там я сделал Worker static, поэтому это статический вложенный класс, а не внутренний класс, но вместо этого он может быть внутренним классом (нет static), если вам нужен доступ к внутренним элементам окружающего класса.
Тогда
public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {
Worker worker = new Worker(firstMap, new HashMap<String, Object>(firstMap));
worker.do1();
worker.do2();
worker.do3();
worker.do4();
//more 20 methods
return worker.lastMap;
}
Вы можете использовать interface и сделать каждый «делать» реализацию функционального интерфейса.
interface Do {
Map<String, Object> apply(Map<String, Object> firstMap, Map<String, Object> lastMap);
}
Затем вы можете инициализировать статические do s:
static Do[] allDos = {
(firstMap, lastMap) -> {
// do0
},
(firstMap, lastMap) -> {
// do1
},
// ...do2, do3, ...
};
Если вам нужно вызвать do0 -> do2 -> do4, например:
public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {
Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);
int[] ids = { 0, 2, 4 };
for (int id : ids)
lastMap = allDos[id].apply(firstMap, lastMap);
return lastMap;
}