代码之家  ›  专栏  ›  技术社区  ›  John

如何在不返回集合本身的情况下返回集合的数据?

  •  0
  • John  · 技术社区  · 6 年前

    我有一个类(a.java),它包含两个ArrayList和HashMap类型的私有字段。
    我还有另一个类(B.java),应该可以访问它们的数据。我可以做两个getter,但我不想按原样归还我的收藏。类B.java应该只能访问数据,不能访问add()、isEmpty()、containsKey()等。
    我是否可以以这种方式返回我的收藏,这样我就可以以某种方式将其用于B类中的foreach,但不允许修改它们?

    2 回复  |  直到 6 年前
        1
  •  3
  •   sprinter    6 年前

    不要退回一个集合,退回一个 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(...);
        }
    }
    
        2
  •  2
  •   Diego Torres Fuerte    6 年前

    创建一个getter方法,该方法返回“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);