大家好,本人是一个java的自学者,希望以后能多多和大家交流。我会将自己学习中的感悟记录在博客中,期望和大家共同进步。我的博客地址是:http://blog.csdn.net/loveoffamily
    最近一段时间一直在学习java核心技术第八版的基础卷。今天看到了匿名内部类一个很高级的用法。本着增进交流,共同提高的目的,特在此分享一下。如果有同学对匿名内部类不熟悉,推荐阅读java核心技术第八版基础卷的229页和228页。如果想更多地了解java中的视图机制,请参看java核心技术第八版基础卷的592页的视图与包装器部分。       首先,我们定义如下一个类:                      class A{
                                  private ArrayList<Card>  list ;                                  public ArrayList<Card> get(){                                          return list ; }                             }在类A中有一个数组列表,同时定义了一个列表的访问器方法,此时,类B的对象可以通过该方法获取数组列表的引用,然后就能对列表执行各种操作了。也就是说,类B的对象对数组列表有完全的操作权限。假设我们不想让类B的对象拥有如此大的权限,比如说,只想让类B的对象获取数组列表中的内容,不允许它对数组列表进行修改,应该怎么办呢?一种办法是在类A中增加如下一个方法并删除访问器方法:                                 public Card get(int index) {                                            return list.get(index) ;                                                             }此时,类B的对象通过调用该方法就可以满足要求。现在,我们希望类B的对象不仅可以访问数组列表中的元素,还可以修改其中的元素,而不能往其中插入元素,这时该怎么办呢?可以在类A中再增加如下方法:                                   public void set(int index,Card aCard) {                                                  list.set(index,aCard) ;                                                 }进一步,假设我们还想类B的对象可以往数组列表中插入元素呢?OK,在类A中继续加方法就是。But,大家想过没有,这样下去,类A中的很多方法都只是为了实现其他类的对象有限地操作数组列表。还有没有什么好的办法呢?答案就是使用匿名内部类实现视图机制。我们在类A中增加如下方法:                              public List<Card> get(){                                  return new AbstractList<Card> () {                                      public Card get(int index) {
                                             return A.this.list.get(index) ;                                        }  }  }这个方法返回一个列表的引用,但是这个列表的引用并不是一个真正意义上的列表,它可以看做是类A中数组列表的“视图”。类B的对象可以调用该方法获取这个“视图”。通过该“视图”,类B的对象可以获取类A中数组列表的元素,但不能执行其它操作。如果想要增加其它操作,只需要在匿名内部类中增加相应的方法就可以了。这样一来,是不是感觉结构清晰多了呢?       俺是一个新手,写这篇博客,完全是根据自己的理解。请各位大牛多多指教啊。