2015-12-29 3 views
3

Я изучал «Java SE 7 Programmer I & II Study Guide», и я не понял объяснений ниже.Инкапсуляция для изменяемых объектов в Java

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. «При инкапсулировании изменяемого объекта, такого как ArrayList, ваш получатель должен возвращать ссылку на копию объекта, а не только ссылку на исходный объект».

Я не понял ни объяснения, ни способы модификации исходного кода.

Таким образом, в GetList() вместо

return list; 

Должны ли мы сделать это?

ArrayList<Integer> list2=list; 
return list2; 

ответ

7

Вы бы заменить:

return list; 

с:

return new ArrayList<Integer>(list); 

В противном случае клиент может сделать ...

foo.getList().add(5); 

нарушение инкапсуляции.

1

Вы можете использовать конструктор копирования

return new ArrayList<Integer>(list); 
2
we do this? 

ArrayList<Integer> list2=list; 
return list2; 

Нет, это говорит о копии объекта, а не копии ссылки.

ArrayList<Integer> list2= new ArrayList<>(); 
list2.addAll(list); 
return list2; 

Или, как указано, ArrayList имеет конструктор копирования, который добавит все элементы из другого списка в новый список. Вышеуказанные три строки предназначены прежде всего для того, чтобы четко понимать, что делается.

0
return list; 

возвратит ссылку на ваш список частных ArrayList это где инкапсуляция ломается.

ArrayList<Integer> list2=list; 
return list2; 

Даже здесь также вы просто передавая ссылку вашего списка в песни2 Вы можете попробовать -

ArrayList<Integer> list2 = new ArrayList<Integer>(); 
list2.addAll(list); 
Смежные вопросы