繁体   English   中英

Java内部类案例

[英]Case for Inner Classes in Java

我试图了解Java中内部类的需求。 我正在阅读的这本书的作者引用了以下示例-

内部类的一个特别重要的用途是制作适配器类。 适配器类是“帮助程序”类,它以一种非常特定的方式将一个类与另一个类联系在一起。 使用适配器类,您可以更自然地编写类,而不必事先预期每个可能的用户需求。 相反,您提供了将您的类嫁接到特定接口的适配器类。 例如,假设我们有一个EmployeeList对象:

 public class EmployeeList {
     private Employee [] employees = ... ;
     ...
 } 

EmployeeList保存有关一组雇员的信息。 假设我们希望EmployeeList通过迭代器提供其元素。 迭代器是指向一系列对象的简单,标准接口。 java.util.Iterator接口具有几种方法:

 public interface Iterator {
     boolean hasNext();
     Object next();
     void remove();
 } 

它使我们能够逐步了解其要素,要求下一个要素并进行测试以查看是否还有更多要素。 迭代器是适配器类的理想选择,因为它是EmployeeList无法轻易实现自身的接口。 为什么列表不能直接实现迭代器? 由于迭代器是“单向”的,因此可以一次性查看 我们的数据。 它不打算重置并再次使用。 可能还需要有多个迭代器 在不同点 浏览 列表。 因此,我们必须将迭代器实现与EmployeeList本身分开。 对于一个提供迭代器功能的简单类,它大声疾呼。 但是那堂课应该是什么样的? 在我们了解内部类之前,我们唯一的求助方法就是建立一个新的“顶级”类。 我们可能有义务将其称为EmployeeListIterator:类EmployeeListIterator实现了Iterator {// //有关EmployeeList的大量知识...}这里,我们有一条注释,表示EmployeeListIterator所需的机制。 只需花一秒钟的时间来思考实现该机器所需要做的事情。 结果类将完全耦合到EmployeeList,在其他情况下将无法使用。 更糟糕的是,为了正常运行,它必须有权访问EmployeeList的内部工作方式。 我们将不得不允许EmployeeListIterator访问EmployeeList中的私有数组,从而使此数据公开的范围超出了应有的范围。 这不理想。

问题:1)我不理解“单向”一次性视图相对于为什么要为内部阶级辩护的含义? 类EmployeeList中的方法应该已经能够实现列表的这种单向导航,不是吗?

2)遍历同一个列表对象的多个迭代器似乎为将迭代器作为一个类提供了条件,因此我可以实例化它多次-但是,这是否意味着下面的类X的一个实例,我可以实例化类的多个实例是啊 如果是这样,那么X的类定义不会明确表明它具有MULTIPLE类型的成员(类Y)-

class X {

   int x1;
   class Y{ }

}

任何指导将不胜感激!

类EmployeeList中的方法应该已经能够实现列表的这种单向导航,不是吗?

假设您需要适配器来实现一个接口,则可以使您的外部类实现该接口,但是现在您的方法并没有完全分开。 您有一些方法可以处理类的原始意图,而另一些方法则是适配器专用的。 当您的类实现多个接口时,它甚至变得更加混乱。

但是,这是否意味着对于下面的类X的一个实例,我可以实例化类Y的多个实例?

是的,您可以实例化Y的多个实例。代码中的class Y {}定义了它的外观,直到实例化它,它才代表class Y实例-您可以执行多次。

class X {

    private void myFunc() {
        Y y0 = new Y();
        Y y1 = new Y();
    }
} 
  1. 假设列表直接提供了该功能。 这意味着当我开始迭代时,列表必须初始化一些状态以记住我在迭代中的位置(第一个元素,第二个元素等)。 然后,我决定停止迭代。 清单怎么知道的? 在不调用stopIterating()方法的情况下如何处理此迭代状态? 委派给一个单独的对象要容易得多:如果停止迭代,我只会忘记迭代器保持迭代状态。 迭代器超出范围并被垃圾回收。

  2. 当然是。 每次调用list.iterator() ,您都将获得一个Iterator的新实例。 在外部类Outer Inner声明内部类Inner并不意味着外部类具有Inner类型的字段。 它只是说必须使用new运算符创建的内部类实例可以访问外部类的实例。 外部类不与内部类实例保持任何关联。 这基本上与内部类是顶级类是一样的,其中Outer类型的字段指向外部类实例。 区别在于,内部类可以访问外部类的所有私有成员,而顶级类则不可能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM