请问一下空接口的好处是什么?适用于什么范围啊?谢谢~

经常看到空接口 可是不知道其设计的好处 什么时候可以借鉴~ 谢谢~

空接口?接口本来就不是自己实现的啊!

象太极拳

可以当作一个标识。虽然不做任何实现,但是标志了这个类的一个特点和将来可能有的行为。
比如序列化接口。

举个具体的例子,比如在应用中我们经常要处理一些事件Event,事件可以有键盘事件KeyEvent、鼠标事件MouseEvent、文本事件TextEvent等等。很明显这些事件一般没有统一的处理方法,,那么需要可以定义相应的事件监听器Listener来处理。不同事件交给不同的事件监听器去监听(捕获)并处理,比如鼠标事件监听器定义如下:
public interface MouseListener extends EventListener {

/**
* Invoked when the mouse button has been clicked (pressed
* and released) on a component.
*/
public void mouseClicked(MouseEvent e);

/**
* Invoked when a mouse button has been pressed on a component.
*/
public void mousePressed(MouseEvent e);

/**
* Invoked when a mouse button has been released on a component.
*/
public void mouseReleased(MouseEvent e);

/**
* Invoked when the mouse enters a component.
*/
public void mouseEntered(MouseEvent e);

/**
* Invoked when the mouse exits a component.
*/
public void mouseExited(MouseEvent e);
};
键盘事件监听器定义如下:
public interface KeyListener extends EventListener {

/**
* Invoked when a key has been typed.
* See the class description for {@link KeyEvent} for a definition of
* a key typed event.
*/
public void keyTyped(KeyEvent e);

/**
* Invoked when a key has been pressed.
* See the class description for {@link KeyEvent} for a definition of
* a key pressed event.
*/
public void keyPressed(KeyEvent e);

/**
* Invoked when a key has been released.
* See the class description for {@link KeyEvent} for a definition of
* a key released event.
*/
public void keyReleased(KeyEvent e);
}
而EventListener定义如下(典型的空接口):

/**
* A tagging interface that all event listener interfaces must extend.
* @since JDK1.1
*/
public interface EventListener {
};
可见,EventListener表明它要对事件进行监听,但由于事件类型各异,没有统一的处理方式,故用空接口表明它要监听各类事件,而具体事件(比如鼠标事件MouseEvent)的监听和处理方式交给具体子类(比如鼠标事件监听器MouseEventListener)去处理。
不知这样回答是否正确,请大家指教。

恩~ 谢谢大家~有点明白了~
是不是可以理解成把某种行为抽象出来
比如说:可以洗衣服,洗车,洗房子等等,他们具体的行动是不同的
但是可以把 洗”作为一个接口,把这类动作统一啊?

不是说空接口么?
怎么又成了讨论接口了?

定义空接口的初衷,打个比方,就像你知道自己要做某件事(比如事件监听),但自己还拿不定主意(也可以说这时候还无从下手,因为要监听的事件类型和处理方式都各不相同)。这时,空接口就相当一个占位符的作用。这样带来的另外一个好处是,拿前面的比喻来说,不管你定义了哪些事件监听器,你最后都可以找到他们最古老的根(EventListener),类的层次也就被刻画出来了,所有各种类型的监听器都被划到一个具有相同含义的种属(Catalog)EventListener下,而不是泛意义上的Object下。

(错了几个字,sorry)
定义空接口的初衷,打个比方,就像你知道自己要做某件事(比如监听事相关类型的件),但自己还拿不出具体措施(也可以说这时候还无从下手,因为要监听的事件类型和处理方式都各不相同)。这时,空接口就相当一个占位符的作用。这样带来的另外一个好处是,拿前面的比喻来说,不管你定义了哪些事件监听器,你最后都可以找到他们最古老的根(EventListener),类的层次也就被刻画出来了,所有各种类型的监听器都被划到一个具有相同含义的种属(Catalog)EventListener下,而不是泛意义上的Object下。

恩~ 谢谢~ 这可以说是对接口的进一步抽象,是吗?

>>恩~ 谢谢~ 这可以说是对接口的进一步抽象,是吗?

不是.

对于一般的compiler,在编译期会对语法,词法,语意进行checking,java提供的空接口就是语意级别的。可以以下的方法验证一下^_^
[1]你使用方法但不声明空接口, 这是过不了编译期restriction的.
[2]验证不同版本处理方式(因为annotation, tiger和1.4或更低JDK版本对待空接口的区别)

你自己定义的空接口:
[1]对子接口的进行分类(instanceof)。
[2]被子接口以名称细化掉(子接口名称的友好)。
[3]作为动态的标记(是一种dynamic的solution, 以前有个同学写过一个关于dynamic query, 用的就是空接口, 找了半天那个例子, 没找到)。
[4]她还不够 用途份量 上的级别, 就和null object基本一个饭量, 只是appetizer而已, 离pattern这种dinner还有距离.

BTW: 空接口不是SUN第一个使用的。^_^

所以这不是"对接口的进一步抽象"

kind regards

好像有个Colneable接口就是个典型的空接口

恩~ 谢谢~ 我再好好研究下你的话~:)

re:2L
空接口就是没有声明任何方法的接口...
[该贴被jinglongjanus于2010-08-10 10:51修改过]