日期:2014-05-20  浏览次数:20567 次

final疑问
第一个例子:
 public class BetterAddressBook {
private final List names;

  public BetterAddressBook(List names) {
this.names = Collections.unmodifiableList(names);
}
  public List getNames() {
return names;
 }
}
BetterAddressBook book = new BetterAddressBook(Arrays.asList("Landau", "Weinberg", "Hawking"));
book.getNames().add(0, "Montana");
//BetterAddressBook是不可变的。Collections类库中的封装类可以确保一旦设置了names的值,就不能对它再有任何更新。
这个Collections.unmodifiableList到底做了什么事让names不能再被改变呢???

第二个例子:
 public class BetterAddressBook {
private final List names;

  public BetterAddressBook(List names) {
this.names = Collections.unmodifiableList(names);
}
  public List getNames() {
return names;
 }
}
List physicists = new ArrayList();
physicists.addAll(Arrays.asList("Landau", "Weinberg", "Hawking"));
BetterAddressBook book = new BetterAddressBook(physicists);
physicists.add("Einstein");
for (String name : book.getNames())
System.out.println(name);
为什么names可以被修改呢??请大家解释一下!!!

------解决方案--------------------
Arrays.asList("Landau", "Weinberg", "Hawking")
这个还回是一个ArrayList,不过不是java.util.ArrayList,是Arrays的一个内部内ArrayList,里面木有add方法,而且数据是存在一个final的数组中,我们知道ArrayList的存储本来就是数组存储,而且该数组可以改变引用。但是这里是final,不能改变引用,所以数组长度就得到了限制。
而且该ArrayList也没提供add,remove方法。只提供set,get方法。所以你那段代码会报错。UnsupportedOperationException