3 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個贊
是的,您可以在Java接口內(nèi)創(chuàng)建嵌套類或內(nèi)部類(請注意,與流行的看法相反,沒有“ 靜態(tài)內(nèi)部類 ”之類的東西:這根本沒有道理,沒有“內(nèi)部”也沒有“嵌套類是靜態(tài)的,因此它不能是“靜態(tài)內(nèi)部”)。
無論如何,以下代碼可以正常編譯:
public interface A {
class B {
}
}
我已經(jīng)看到它曾經(jīng)在接口定義中直接放置了某種“合同檢查器”(好吧,在嵌套在接口中的類中,它可以具有靜態(tài)方法,而與接口本身相反,而不能)。如果我沒記錯的話,看起來像這樣。
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)
}
}
}
請注意,我沒有評論這種事情的用處,我只是在回答您的問題:它可以完成,這是我見過的一種用法。
現(xiàn)在,我不會評論這種構(gòu)造的有用性,并且從我已經(jīng)看到的內(nèi)容:我已經(jīng)看到了,但是它不是很常見的構(gòu)造。
200KLOC代碼庫在這里發(fā)生的時間恰好是零時間(但是,我們還有很多其他事情,我們認(rèn)為不良行為也恰好發(fā)生在零時間,所以其他人也會發(fā)現(xiàn)這完全是正常的……)。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個贊
是的,我們可以在接口內(nèi)部有類。用法的一個例子可能是
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();
}
這里的代碼有兩個嵌套的類,用于封裝有關(guān)事件對象的信息,這些信息隨后在諸如getKeyEvents()的方法定義中使用。將它們包含在Input接口中可以提高凝聚力。

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個贊
有效的使用,恕我直言,正在定義由封閉的接口方法接收或返回的對象。通常是數(shù)據(jù)保存結(jié)構(gòu)。這樣,如果該對象僅用于該接口,那么您將擁有更加緊密的聯(lián)系。
例如:
interface UserChecker {
Ticket validateUser(Credentials credentials);
class Credentials {
// user and password
}
class Ticket {
// some obscure implementation
}
}
但是無論如何……這只是口味的問題。
添加回答
舉報(bào)