Answers:
是的,您可以在Java接口内创建嵌套类或内部类(请注意,与普遍看法相反,没有“ 静态内部类 ”之类的东西:这根本没有意义,没有“内部”也没有“嵌套类是静态的,因此它不能是“静态内部”)。
无论如何,以下代码可以正常编译:
public interface A {
class B {
}
}
我已经看到它曾经在接口定义中直接放置了某种“合同检查器”(好吧,在嵌套在接口中的类中,它可以具有静态方法,而与接口本身相反,而不能)。如果我没记错的话,看起来像这样。
public interface A {
static class B {
public static boolean verifyState( A a ) {
return (true if object implementing class A looks to be in a valid state)
}
}
}
请注意,我没有评论这种事情的用处,我只是在回答您的问题:它可以完成,这是我见过的一种用法。
现在,我不会评论这种构造的有用性,并且从我已经看到的内容:我已经看到了,但是它不是很常见的构造。
200KLOC代码库在这里发生的时间恰好是零时间(但是,我们还有很多其他事情,我们认为不良行为也恰好发生在零时间,所以其他人也会发现这很正常)。
interface
s 不能具有内部类。您可以省略嵌套类的static
修饰符,interface
但仍然是嵌套类,而不是内部类。
B
该类也是静态嵌套类,而不是内部类。接口得到特殊处理。除了规范本身之外,我在网上找不到这方面的内容:“接口的成员类是隐式静态的,因此永远不被视为内部类。” docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3
是的,我们可以在接口内部有类。用法的一个例子可能是
public interface Input
{
public static class KeyEvent {
public static final int KEY_DOWN = 0;
public static final int KEY_UP = 1;
public int type;
public int keyCode;
public char keyChar;
}
public static class TouchEvent {
public static final int TOUCH_DOWN = 0;
public static final int TOUCH_UP = 1;
public static final int TOUCH_DRAGGED = 2;
public int type;
public int x, y;
public int pointer;
}
public boolean isKeyPressed(int keyCode);
public boolean isTouchDown(int pointer);
public int getTouchX(int pointer);
public int getTouchY(int pointer);
public float getAccelX();
public float getAccelY();
public float getAccelZ();
public List<KeyEvent> getKeyEvents();
public List<TouchEvent> getTouchEvents();
}
这里的代码有两个嵌套的类,用于封装有关事件对象的信息,这些信息随后在诸如getKeyEvents()的方法定义中使用。将它们包含在Input接口中可以提高凝聚力。
一个有趣的用例是通过内部类提供某种默认实现,以通过内部类来接口方法:https : //stackoverflow.com/a/3442218/454667(以克服单一类继承的问题)。
是的,可以在接口中包含静态类定义,但是此功能最有用的方面可能是在使用枚举类型(这是静态类的特殊类型)时。例如,您可以具有以下内容:
public interface User {
public enum Role {
ADMIN("administrator"),
EDITOR("editor"),
VANILLA("regular user");
private String description;
private Role(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
public String getName();
public void setName(String name);
public Role getRole();
public void setRole(Role role);
...
}
@Bachi提到的内容与Scala中的特征相似,实际上是使用接口内的嵌套类实现的。可以用Java模拟。另请参见java traits或mixins模式?
也许当您想要更复杂的构造(例如某些不同的实现行为)时,请考虑:
public interface A {
public void foo();
public static class B implements A {
@Override
public void foo() {
System.out.println("B foo");
}
}
}
这是您的界面,这将是实现者:
public class C implements A {
@Override
public void foo() {
A.B b = new A.B();
b.foo();
}
public static void main(String[] strings) {
C c = new C();
c.foo();
}
}
可能会提供一些静态实现,但我不知道这不会造成混淆。