3 回答
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代码库在这里发生的时间恰好是零时间(但是,我们还有很多其他事情,我们认为不良行为也恰好发生在零时间,所以其他人也会发现这完全是正常的……)。
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接口中可以提高凝聚力。
TA贡献1900条经验 获得超5个赞
有效的使用,恕我直言,正在定义由封闭的接口方法接收或返回的对象。通常是数据保存结构。这样,如果该对象仅用于该接口,那么您将拥有更加紧密的联系。
例如:
interface UserChecker {
Ticket validateUser(Credentials credentials);
class Credentials {
// user and password
}
class Ticket {
// some obscure implementation
}
}
但是无论如何……这只是口味的问题。
添加回答
举报