内部类在接口

是可以在界面内创build一个内部类? 如果是的话,我们为什么要这样创造? 反正我们不打算创build任何接口对象?

他们在开发过程中有帮助吗?

是的,你可以在Java接口中创build一个嵌套类或一个内部类(注意与普遍的观点相反,没有“ 静态内部类 ”这样的东西:这根本没有意义,没有什么“内在”,也没有“ outter“类,当一个嵌套类是静态的,所以它不能是”静态内部“)。

无论如何,下面的编译罚款:

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代码库在这里发生这完全零时间(但是,那么我们有很多其他的事情,我们认为不好的做法发生完全零时间太其他人会发现完全正常,所以…)。

是的,我们可以在接口中有类。 使用的一个例子可能是

 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接口里可以提高内聚性。

一个有效的用法,恕我直言,是定义由封闭的接口方法接收或返回的对象。 有助于数据保持结构。 这样,如果对象仅用于该接口,则可以使事物处于更有凝聚力的状态。

举例来说:

 interface UserChecker { Ticket validateUser(Credentials credentials); class Credentials { // user and password } class Ticket { // some obscure implementation } } 

但无论如何…这只是一个品味问题。

从Java 7规范引用:

“接口可能包含成员types声明(第8.5节),接口中的成员types声明是隐含的静态和公共的,允许冗余地指定这两个修饰符中的一个或两个。

在Java接口中声明非静态类是不可能的,这对我来说是有意义的。

一个有趣的用例是通过一个内部类提供一种默认的实现来接口方法,如下所示: https : //stackoverflow.com/a/3442218/454667 (为了克服单一类inheritance的问题)。

这当然是可能的,我发现它有用的一种情况是当一个接口必须抛出自定义exception。 你保持与他们相关的接口的例外,我认为这往往比乱七八糟的exception文件乱扔你的源码树更整洁。

 interface MyInterface { public static class MyInterfaceException extends Exception { } void doSomething() throws MyInterfaceException; } 

是的,可以在一个接口中有静态类定义,但是当使用枚举types(这是特殊types的静态类)时,这个特性最有用的方面也许是可能的。 例如,你可以有这样的东西:

 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特征或mixin模式?

也许当你想要更复杂的结构像一些不同的实现行为时,可以考虑:

  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(){ AB b = new AB(); b.foo(); } public static void main(String[] strings) { C c = new C(); c.foo(); } } 

可能会提供一些静态实现,但不会混淆,我不知道。

我发现了这种types的构造。

  1. 你可以使用这个构造来定义和分组所有的静态最终常量。
  2. 因为它是一个接口,你可以在一个类上实现这个接口。

你可以访问所有分组的常量; 在这种情况下,该类的名称充当命名空间。

您还可以为实现此接口的对象创build“Helper”静态类,以实现通用function:

 public interface A { static class Helper { public static void commonlyUsedMethod( A a ) { ... } } } 

我现在需要一个。 我有一个接口,它可以很方便地从几个方法中返回一个独特的类。 这个类只能作为这个接口方法响应的容器。

因此,有一个静态的嵌套类定义是很方便的,它只与这个接口相关联,因为这个接口应该是创build这个结果容器类的唯一地方。

例如Groovy中的特征 (像实现方法的接口一样)。 它们被编译成一个包含所有方法实现的内部类的接口。