我真的很喜欢Java功能,但我不想放弃将它用于下一个问题:
我有一个可以继承的类,它的内部是一个private ArrayList arr;
,所以setter函数是可以的,但是getter函数return arr;
返回对该变量的引用,任何人都可以编辑我不需要的整个数组并私有(private)没有任何意义!
在C++中,我只是return const arr;
,它将返回对该变量的常量引用。
我非常需要不要克隆或手动复制变量,因为有太多的计算需要(只读变量)为什么在Java中没有const返回?有什么办法可以避免复印?
p.s (final ArrayList<Integer> arr;)
不是一个选项,因为该数组总是更改大小或元素值。
如果我找不到修复程序,则威胁要回到C++或将所有内容公开,因此您永远不要获取我的软件:D
编辑:一个更重要的问题:我是在问不好的东西吗(软件工程方面),我的意思是,如果JAVA创建者认为没有const引用(返回只读引用),那么我必须要问其他可以处理的问题办法。否则我的程序设计是错误的,我很困惑。
最佳答案
用java.util.Collections.unmodifiableList包装返回值。它不会复制数据,但会包装原始列表,并将只读操作委托(delegate)给基础列表。修改列表的操作会在运行时通过UnsupportedOperationException
拒绝。
您的
return arrayList;
变成
return Collections.unmodifiableList(arrayList);
不幸的是,编译器不会强制执行只读约束。但是,它们将在运行时强制执行。
您还可以使用:unmodifiableSet,unmodifiableMap,unmodifiableCollection,unmodifiableSortedSet和unmodifiableSortedMap。如果这些还不够,您仍然可以从这种通用设计方法中获得启发,并创建自己的自定义只读包装器类。