Как вернуть данные коллекций, не возвращая саму коллекцию? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть класс (A.java), который содержит два закрытых поля типа ArrayList и HashMap.
У меня также есть другой класс (B.java), который должен иметь доступ к своим данным.Я мог бы сделать два добытчика, но я не хочу возвращать свои коллекции как есть.Класс B.java должен иметь доступ только к данным, а не к add (), isEmpty (), containsKey () и т. Д.
Могу ли я вернуть свои коллекции таким образом, чтобы я мог каким-то образом использовать их с foreach в классе Bно без предоставления возможности их изменять?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Не возвращать коллекцию, вернуть Stream.Таким образом, пользователю будет легко узнать, что он получает поток объектов, а не коллекцию.И реализацию коллекции легко изменить, не меняя способ ее использования.Пользователь может фильтровать, отображать, уменьшать и т. Д.

Итак:

class A {
    private List<C> cs = new ArrayList<>();

    public Stream<C> getCs() {
        return cs.stream();
    }
}

class B {
    public void processCs(A a) {
        a.getCs().filter(C::hasFooness).forEach(...);
    }
}
0 голосов
/ 17 мая 2018

Создайте метод получения, который возвращает «Collections.unmodifiableList ()», например:

List<String> strings = new ArrayList<String>();
List<String> unmodifiable = Collections.unmodifiableList(strings);
unmodifiable.add("New string"); // will fail at runtime
strings.add("Aha!"); // will succeed
System.out.println(unmodifiable);
...