3 回答

TA貢獻1772條經驗 獲得超6個贊
是的,您可以在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
}
}
但是無論如何……這只是口味的問題。
添加回答
舉報