为了账号安全,请及时绑定邮箱和手机立即绑定

接口内的内部类

接口内的内部类

慕无忌1623718 2019-11-25 15:48:01
是否可以在接口内创建内部类?如果可能的话,由于我们不打算创建任何接口对象,为什么我们要创建一个内部类呢?这些内部类在任何开发过程中都有帮助吗?
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-11-25
?
呼唤远方

TA贡献1856条经验 获得超11个赞

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


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接口中可以提高凝聚力。


查看完整回答
反对 回复 2019-11-25
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

有效的使用,恕我直言,正在定义由封闭的接口方法接收或返回的对象。通常是数据保存结构。这样,如果该对象仅用于该接口,那么您将拥有更加紧密的联系。


例如:


interface UserChecker {

   Ticket validateUser(Credentials credentials);


   class Credentials {

      // user and password

   }


   class Ticket {

      // some obscure implementation

   }

}

但是无论如何……这只是口味的问题。


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 412 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信