Java 中可变对象的封装
Encapsulation for mutable objects in Java
我在研究"Java SE 7 Programmer I & II Study Guide"下面的解释没看懂
class Fortress{
private String name;
private ArrayList<Integer> list;
Fortress() {list=new ArrayList<Integer>;
String getName{return name;}
void addToList(int x){list.add(x);}
ArrayList getList(){return list;} // line 1
}
哪几行代码破坏了封装?答案:第 9 行。"When encapsulating a mutable object like an ArrayList, your getter must return a reference to a copy of the object, not just the reference to the original object".
没看懂解释,也没看懂怎么修改原代码
所以在 getList() 而不是
return list;
我们应该这样做吗?
ArrayList<Integer> list2=list;
return list2;
可以使用拷贝构造函数
return new ArrayList<Integer>(list);
你会替换:
return list;
与:
return new ArrayList<Integer>(list);
否则客户可以做...
foo.getList().add(5);
破坏封装。
we do this?
ArrayList<Integer> list2=list;
return list2;
不,它说的是对象的副本,而不是引用的副本。
ArrayList<Integer> list2= new ArrayList<>();
list2.addAll( list );
return list2;
或者正如指出的那样,ArrayList
有一个复制构造函数,可以将另一个列表中的所有元素添加到新列表中。上面三行主要是为了弄清楚在做什么。
return list;
return 对您的 私有 ArrayList 列表的引用 这是封装中断的地方。
ArrayList<Integer> list2=list;
return list2;
即使在这里,您也只是将 list 的引用传递给 list2 您可以尝试 -
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.addAll(list);
我在研究"Java SE 7 Programmer I & II Study Guide"下面的解释没看懂
class Fortress{
private String name;
private ArrayList<Integer> list;
Fortress() {list=new ArrayList<Integer>;
String getName{return name;}
void addToList(int x){list.add(x);}
ArrayList getList(){return list;} // line 1
}
哪几行代码破坏了封装?答案:第 9 行。"When encapsulating a mutable object like an ArrayList, your getter must return a reference to a copy of the object, not just the reference to the original object".
没看懂解释,也没看懂怎么修改原代码
所以在 getList() 而不是
return list;
我们应该这样做吗?
ArrayList<Integer> list2=list;
return list2;
可以使用拷贝构造函数
return new ArrayList<Integer>(list);
你会替换:
return list;
与:
return new ArrayList<Integer>(list);
否则客户可以做...
foo.getList().add(5);
破坏封装。
we do this?
ArrayList<Integer> list2=list;
return list2;
不,它说的是对象的副本,而不是引用的副本。
ArrayList<Integer> list2= new ArrayList<>();
list2.addAll( list );
return list2;
或者正如指出的那样,ArrayList
有一个复制构造函数,可以将另一个列表中的所有元素添加到新列表中。上面三行主要是为了弄清楚在做什么。
return list;
return 对您的 私有 ArrayList 列表的引用 这是封装中断的地方。
ArrayList<Integer> list2=list;
return list2;
即使在这里,您也只是将 list 的引用传递给 list2 您可以尝试 -
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.addAll(list);