接口中的内部类

2022-08-31 09:32:00

是否可以在接口中创建内部类
如果可能的话,为什么我们要创建一个这样的内部类,因为我们不打算创建任何接口对象?

这些内部类对任何开发过程都有帮助吗?


答案 1

是的,我们可以在接口内有类。一个用法示例可能是

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()。将它们放在输入接口中可以提高内聚力。


答案 2

是的,您可以在Java接口中创建嵌套类或内部类(请注意,与普遍的看法相反,没有“静态内部类”这样的东西:这根本没有意义,当嵌套类是静态的时,没有“内部”和“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代码库在这里,这种情况恰好发生时间为零(但是我们还有很多其他的事情,我们认为这些不良做法也恰好在零时间发生,其他人会发现完全正常,所以...)。