我正在阅读接口包含的内容,并且我理解除了通常它们还可以包含内部类或其他接口。
任何人都可以解释为什么或出于什么目的将接口放入接口中。还有为什么有人会在里面放一个内部类。我在网上查看过,但除了指向标准 java 类之一的链接外,没有找到任何好的解释。我真正需要帮助我理解的是一个简单的例子。
我正在阅读接口包含的内容,并且我理解除了通常它们还可以包含内部类或其他接口。
任何人都可以解释为什么或出于什么目的将接口放入接口中。还有为什么有人会在里面放一个内部类。我在网上查看过,但除了指向标准 java 类之一的链接外,没有找到任何好的解释。我真正需要帮助我理解的是一个简单的例子。
这是我使用内部类的接口的摘录:
public interface EmailService {
void send(EmailDetails details);
class EmailDetails {
private String from;
private List<String> to = Lists.newArrayList();
private String messageTemplate;
//...
}
}
你看 - 关键是接口需要一些额外的定义(在这种情况下 - 它的方法接受的参数)。内部接口也是一样的。
它可能是一个单独的类/接口,但由于它只与这个接口相关,所以我把它放在那里。
您不会用仅与一个特定类或接口相关的事物来污染命名空间。
然而,内部类(如果不是静态的)比内部接口更相关,因为它们包含指向包含类实例的隐藏链接;因此内部类的实例总是隐式绑定到外部类的实例:
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
}
};
这通常与匿名类(根据定义为内部类)结合使用,例如提供事件处理程序。
为了建立牢固的Composition
关系,我们追求inner classes
。
编辑:
heart
当人的对象被构造的同时,心的对象也被构造时,人就有了。Heart
对象范围在人的身体之外没有任何意义,所以Heart
类应该是inner
类的Man
类。
由于 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();
}
}
之前已经解决了这个问题,让我引用一个很好的理由:
使用内部接口的一个很好的理由是它的功能是否与它所在的类[或接口]直接相关。一个很好的例子就是监听器。如果您有一个类 [或接口] Foo,并且您希望其他类 [或接口] 能够侦听其上的事件,则可以声明一个名为 FooListener 的接口,这可以,但声明可能会更清楚一个内部接口并让那些其他类 [接口] 实现 Foo.Listener
一个样品:
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 的内部接口,而不是顶层接口。
但实际上,内部接口是例外而不是规则。