我正在阅读接口包含的内容,我理解除了通常它们还可以包含内部类或其他接口。
任何人都可以解释为什么或者出于什么目的想要在接口中放置接口。也是为什么有人会把内部课程放在里面。我在网上看了一下但没有找到任何好的解释,除了指向标准java类之一的链接。我真正需要帮助我理解的是一个简单的例子。
答案 0 :(得分:5)
以下是我使用内部类的接口的摘录:
public interface EmailService {
void send(EmailDetails details);
class EmailDetails {
private String from;
private List<String> to = Lists.newArrayList();
private String messageTemplate;
//...
}
}
你知道 - 重点是界面需要一些额外的定义(在这种情况下 - 它的方法接受的参数)。内部接口也是如此。
它可能是一个单独的类/接口,但因为它只与这个接口有关,所以我把它放在那里。
答案 1 :(得分: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
}
};
这通常与匿名类(根据定义是内部类)结合使用,例如:提供事件处理程序。
答案 2 :(得分:1)
为了实现强大的Composition
关系,我们选择inner classes
。
修改强>
一个人有heart
所以当Man的对象被构造的同时构建了heart的对象。Heart
对象范围没有人类身体的意义所以Heart
类应该{ {1}} inner
类的课程。
答案 3 :(得分: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
不会扩展车辆?),但我希望你有这个想法。
那么内部接口呢?例如
class View{
public static interface OnClickListener{ //this interface associated with View, so it's more readable
public void onClick();
}
}
答案 4 :(得分:1)
之前已经解决了,让我引用其中一个good reasons:
使用内部接口的一个很好的理由是它的函数与它所在的类[或接口]直接相关。一个很好的例子就是一个监听器。如果你有一个类[或接口] Foo,并且你希望其他类[或接口]能够监听它上面的事件,你可以声明一个名为FooListener的接口,这没关系,但是声明它可能会更清楚一个内部接口,并让其他类[接口]实现Foo.Listener
答案 5 :(得分: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
我想因为入口界面与Map紧密相关,API设计者决定让Entry成为Map的内部接口而不是顶级接口。
在实践中,内部接口是规则的例外,但是。