4

我正在阅读接口包含的内容,并且我理解除了通常它们还可以包含内部类或其他接口。

任何人都可以解释为什么或出于什么目的将接口放入接口中。还有为什么有人会在里面放一个内部类。我在网上查看过,但除了指向标准 java 类之一的链接外,没有找到任何好的解释。我真正需要帮助我理解的是一个简单的例子。

4

6 回答 6

5

这是我使用内部类的接口的摘录:

public interface EmailService {

    void send(EmailDetails details);

    class EmailDetails {
        private String from;
        private List<String> to = Lists.newArrayList();
        private String messageTemplate;
        //...
    }
}

你看 - 关键是接口需要一些额外的定义(在这种情况下 - 它的方法接受的参数)。内部接口也是一样的。

它可能是一个单独的类/接口,但由于它只与这个接口相关,所以我把它放在那里。

于 2012-06-14T10:10:40.423 回答
2

您不会用仅与一个特定类或接口相关的事物来污染命名空间。

然而,内部类(如果不是静态的)比内部接口更相关,因为它们包含指向包含类实例的隐藏链接;因此内部类的实例总是隐式绑定到外部类的实例:

class OuterClass {

   int someField;

   class InnerClass {

      void doSomething () {
         someField += 1; // you can access someField from here
      }

   };

   void methodUsingInnerClass () {
      InnerClass obj = new InnerClass (); // obj knows to which instance of OuterClass it belongs
      someField = 0;
      obj.doSomething ();
      // now someField == 1
   }
};

这通常与匿名类(根据定义为内部类)结合使用,例如提供事件处理程序。

于 2012-06-14T10:37:34.153 回答
1

为了建立牢固的Composition关系,我们追求inner classes

编辑:

heart当人的对象被构​​造的同时,心的对象也被构造时,人就有了。Heart对象范围在人的身体之外没有任何意义,所以Heart类应该是inner类的Man类。

于 2012-06-14T10:08:21.407 回答
1

由于 Java 没有多重继承,内部类可以非常方便。例如:

class Vehicle{
}

class Transporter{
}

//you cant create class like this
//class Car extends Vehicle, Transporter {}

//but you can create something like that
class Car extends Vehicle{

    class InnerTransporter extends Transporter{}

}

这不是一个完美的例子(为什么Transporter不扩展 Vehicle?),但我希望你明白了。

那么内部接口呢?例如

class View{

    public static interface OnClickListener{ //this interface associated with View, so it's more readable
        public void onClick();
    }

}
于 2012-06-14T10:10:18.550 回答
1

之前已经解决了这个问题,让我引用一个很好的理由

使用内部接口的一个很好的理由是它的功能是否与它所在的类[或接口]直接相关。一个很好的例子就是监听器。如果您有一个类 [或接口] Foo,并且您希望其他类 [或接口] 能够侦听其上的事件,则可以声明一个名为 FooListener 的接口,这可以,但声明可能会更清楚一个内部接口并让那些其他类 [接口] 实现 Foo.Listener

于 2012-06-14T10:15:54.977 回答
1

一个样品:

http://docs.oracle.com/javase/7/docs/api/java/util/Map.html

http://docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.html

我猜是因为 entry 接口确实和 Map 紧密相关,所以 API 设计者决定让 Entry 成为 Map 的内部接口,而不是顶层接口。

但实际上,内部接口是例外而不是规则。

于 2012-06-14T10:26:06.460 回答