java如何防止修改类中的私有字段?
假设我有一门课:
public class Test
{
private String[] arr = new String[]{"1","2"};
public String[] getArr()
{
return arr;
}
}
现在,我有另一个类使用上述类:
Test test = new Test();
test.getArr()[0] ="some value!"; //!!!
这就是问题所在:我从外部访问了一个类的私有字段! 我怎样才能防止这种情况?我的意思是如何使这个数组不可变?这是否意味着使用每一种getter方法都可以访问私有字段?(我不想要任何像番石榴这样的图书馆,我只需要知道正确的方法)
# 1 楼答案
您还可以使用^{} ,它应该比标准
unmodifiableList
更好。该类是由Google创建的Guava库的一部分以下是描述:
下面是如何使用它的一个简单示例:
# 2 楼答案
已经提到了
Collections.unmodifiableList
,奇怪的是Arrays.asList()
没有!我的解决方案也是从外部使用列表,并按如下方式包装数组:复制数组的问题是:如果每次访问代码时都要复制,而且数组很大,那么肯定会为垃圾收集器创建大量工作。因此,复制是一种简单但非常糟糕的方法——我会说“便宜”,但内存昂贵!尤其是当你有两个以上的元素时
如果您查看
Arrays.asList
和Collections.unmodifiableList
的源代码,实际上创建的代码并不多。第一个只包装数组而不复制它,第二个只包装列表,使对它的更改不可用# 3 楼答案
如果可以使用列表而不是数组,Collections provides an unmodifiable list:
# 4 楼答案
修饰符
private
只保护字段本身不被其他类访问,而不保护该字段的对象引用。如果您需要保护引用的对象,请不要给出它。改变致:
或
# 5 楼答案
您必须返回数组的副本
# 6 楼答案
从这个角度来看,您应该使用系统阵列副本: