Как создать цепочечные методы в Java - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть класс, отвечающий за управление объектами, созданными во время выполнения - он строит их из входных данных в колебательных кадрах - как DAO. У него есть этот метод, который удаляет уже созданные объекты:

public void removeFrom(Class<?> clazz, int index) {
    for (Map.Entry<String, Object> entry : modelsMap.entrySet()) {
        if (entry.getKey().equals(clazz.getSimpleName())) {
            ((ArrayList<Object>) entry.getValue()).remove(index);
        }
    }
}

Вместо вызова этого метода и передачи референтного класса и индекса, я хотел бы, чтобы вызов метода был таким: dao.removeFrom(MyObject.class).at(myIndex); Думаю, это похоже на цепочечные методы, которые использует Stream API. Рад, что кто-нибудь может мне помочь!

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Пожалуйста, проверьте шаблон проектирования Builder. Попробуйте создать шаблон проектирования для простого объекта, у которого мало атрибутов, методов получения и установки.

Как только вы сможете это сделать, цепочка методов будет выглядеть очень четко. :)

0 голосов
/ 05 ноября 2018

Вы можете ввести класс DaoRemover, экземпляр которого вы можете создать с помощью метода фабрики и методы экземпляра которого возвращают текущий экземпляр.

Например:

public class DaoRemover {
    private Map<String, Object> modelsMap; // your actual data
    private final List<ArrayList<Object>> list; // list of list after filtering on the class


    public static DaoRemover of(Class<?> clazz) {
        return new DaoRemover(clazz);
    }

    private DaoRemover(Class<?> clazz) {
        list = modelsMap.entrySet()
                        .stream()
                        .filter(e -> e.getKey()
                                      .equals(clazz.getSimpleName()))
                        .map(e -> (ArrayList<Object>) e.getValue())
                        .collect(toList());
    }

    public DaoRemover at(int index) {
        list.forEach(l -> l.remove(index));
        return this;
    }

}

Вы можете сделать сейчас:

DaoRemover.of(MyObject.class)
          .at(myIndex); 

или

DaoRemover.of(MyObject.class)
          .at(myIndex) 
          .at(myOtherIndex); 
0 голосов
/ 05 ноября 2018

В этом случае ваш removeFrom() метод должен возвращать оболочку около ((ArrayList<Object>) entry.getValue()). И эта оболочка должна иметь метод at(int index), который удаляет элемент для данного индекса.

И вам также нужно подумать о угловом случае, когда у вашего modelsMap нет записи для данного clazz.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...