A类实例具有私有ArrayList。该实例负责维护存储在arrayList中的数据。
private ArrayList<SomeDataStructure> myPrivateArrayList;
但是,当其他模块询问数据时,这个A类实例必须传递任何要求它的数据,因此,A类中有公共函数:
public ArrayList<SomeDataStructure> getMyPrivateArrayList ();
我的问题是,我应该如何实现这个功能,以便我可以保证那些通过这个公共函数获取arrayList的人将无法修改它(即返回值只读)?
提前致谢!
答案 0 :(得分:6)
我建议这样做(如果你被允许在你的情况下):
private ArrayList<SomeDataStructure> myPrivateArrayList;
public List<SomeDataStructure> getMyPrivateList () {
return Collections.unmodifiableList(myPrivateArrayList)
}
请注意,公开的数据结构类型为List
,而不是ArrayList
。我认为(一般来说)类的公共接口不应返回具体类型,而应返回接口。它简化了这个任务,并且还减少了一个类对另一个类的实现的依赖程度。
答案 1 :(得分:0)
使用ArrayList<SomeDataStructure>
而不是返回类型List<SomeDataStructure>
。然后,您可以使用the java.util.Collections.unmodifiableList(...)
utility-method创建列表的只读视图:
public List<SomeDataStructure> getMyPrivateArrayList()
{
return Collections.unmodifiableList(myPrivateArrayList);
}
另一种选择是返回列表的副本:
public ArrayList<SomeDataStructure> getMyPrivateArrayList()
{
return new ArrayList<SomeDataStructure>(myPrivateArrayList);
}
(还有一些其他选项,但这些是最常用的方法。)
但请记住,如果SomeDataStructure
是可变的,那么上述任何一个的调用者仍然可以改变列表中的任何对象。 (也就是说,他们可以做obj.getMyPrivateArrayList().get(0).setProp(null)
之类的事情。)
答案 2 :(得分:0)
在getMyPrivateArrayList ()
功能中执行以下操作:
public List<SomeDataStructure> getMyPrivateArrayList(){
return Collections.unmodifiableList(myPrivateArrayList);
}
Collections.unmodifiableList(someList)
返回只读列表。
<小时/> 在您的调用类中,如果您尝试修改返回的列表,则会在运行时出现错误。 例如。
如果您执行以下操作
List<SomeDataStructure> readOnlyList=getMyPrivateArrayList();
readOnlyList.add(new SomeDataStructure());
您将收到以下错误:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableList.add(Collections.java:1160)
at MainClass.main(MainClass.java:14)
答案 3 :(得分:0)
您需要获取清单吗?或者你可以简单地将一些访问者转发到列表中吗?您可以定义一些公共函数,如get(index)
,只需调用列表中的等效方法并返回结果即可。这很可能是你想要做的,因为它只允许人们访问你选择的方法,你不必自己给它们列表或浪费CPU周期将数据复制到“只读”结构中。