返回数组列表的常量引用

2022-09-03 13:15:09

我真的很欣赏java功能,我不想放弃在下一个问题中使用它:

我有一个可能被继承的类,它里面是一个 所以 setter 函数是可以的 ,但是 getter 函数返回对该变量的引用,任何能够编辑我不想要的整个数组和私有的任何人都没有任何意义!private ArrayList arr;return arr;

在C++我会只是,它会返回对变量的常量引用。return const arr;

我非常需要变量不被克隆或手动复制,因为有太多的计算需要(只读变量)为什么在java中没有const返回????有什么办法可以逃脱复制吗?

p.s 不是一个选项,因为数组总是更改大小或元素值。(final ArrayList<Integer> arr;)

如果我找不到修复方法,我威胁要回到C++或公开所有内容,你永远不应该让我的软件:D


编辑:一个更重要的问题:我是否要求一些不好的东西(软件工程明智),我的意思是如果JAVA创建者认为没有const引用(返回只读引用),那么我必须要求一些可以用其他方式处理的东西。或者我的程序设计错了,我很困惑。


答案 1

使用 java.util.Collections.unmodifiableList 包装返回值。它不创建数据的副本,但包装原始列表,并将只读操作委派给基础列表。在运行时通过 拒绝修改列表的操作。UnsupportedOperationException

return arrayList;

成为

return Collections.unmodifiableList(arrayList);

遗憾的是,编译器不会强制执行只读约束。但是,它们将在运行时强制执行。

您还可以使用:unmodifiableSetunmodifiableMapunmodifiableCollectionunmodifiableSortedSetunmomodifiableSortedMap。如果这些还不够,您仍然可以从这种常规设计方法中获取灵感,并创建自己的自定义只读包装类。


答案 2

:)您有几种选择:

  • 不要公开 getter,只提供允许调用的方法,例如

    public void addToList(Object arg) { this.arr.add(arg);}

  • 返回不可变对象:

    public List getArr() { return Collections.unmodifiableList(this.arr); }


推荐