匿名内部类的神奇用法——实现视图机制

          最近一段时间一直在学习java核心技术第八版的基础卷。今天看到了匿名内部类一个很高级的用法。本着增进交流,共同提高的目的,特在此分享一下。如果有同学对匿名内部类不熟悉,推荐阅读java核心技术第八版基础卷的229页和228页。如果想更多地了解java中的视图机制,请参看java核心技术第八版基础卷的592页的视图与包装器部分。

       首先,我们定义如下一个类:

                      class A{

                                  private ArrayList  list ;

                                  public ArrayList 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 get(){

                                                 return new AbstractList () {

                                                                  public Card get(int index) {

                                                                                   return A.this.list.get(index) ;

                                                                                                           }  }  }

这个方法返回一个列表的引用,但是这个列表的引用并不是一个真正意义上的列表,它可以看做是类A中数组列表的“视图”。类B的对象可以调用该方法获取这个“视图”。通过该“视图”,类B的对象可以获取类A中数组列表的元素,但不能执行其它操作。如果想要增加其它操作,只需要在匿名内部类中增加相应的方法就可以了。这样一来,是不是感觉结构清晰多了呢?

       俺是一个新手,写这篇博客,完全是根据自己的理解。请各位大牛多多指教啊。

                                       

 

你可能感兴趣的:(javase学习笔记)