如何让我的代码安全? - 私人与公众

时间:2011-12-03 03:19:26

标签: java android oop

A类实例具有私有ArrayList。该实例负责维护存储在arrayList中的数据。

private ArrayList<SomeDataStructure> myPrivateArrayList;

但是,当其他模块询问数据时,这个A类实例必须传递任何要求它的数据,因此,A类中有公共函数:

public ArrayList<SomeDataStructure> getMyPrivateArrayList ();

我的问题是,我应该如何实现这个功能,以便我可以保证那些通过这个公共函数获取arrayList的人将无法修改它(即返回值只读)?

提前致谢!

4 个答案:

答案 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周期将数据复制到“只读”结构中。