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

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

mythmoon
2005-12-28 20:52
空接口?接口本来就不是自己实现的啊!

banq
2005-12-29 09:42
象太极拳

blueoxygen
2005-12-29 11:10
可以当作一个标识。虽然不做任何实现,但是标志了这个类的一个特点和将来可能有的行为。

比如序列化接口。

chenyongguang
2005-12-29 15:01
举个具体的例子,比如在应用中我们经常要处理一些事件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)去处理。

不知这样回答是否正确,请大家指教。

贾飞
2005-12-29 19:56
恩~ 谢谢大家~有点明白了~

是不是可以理解成把某种行为抽象出来

比如说:可以洗衣服,洗车,洗房子等等,他们具体的行动是不同的

但是可以把 洗”作为一个接口,把这类动作统一啊?

blueoxygen
2005-12-30 09:20
不是说空接口么?

怎么又成了讨论接口了?

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

chenyongguang
2005-12-30 20:37
(错了几个字,sorry)

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

贾飞
2005-12-31 08:53
恩~ 谢谢~ 这可以说是对接口的进一步抽象,是吗?

whatavery
2006-01-02 03:50
>>恩~ 谢谢~ 这可以说是对接口的进一步抽象,是吗?

不是.

对于一般的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

MiMiEye
2006-01-03 19:53
好像有个Colneable接口就是个典型的空接口

贾飞
2006-01-04 09:06
恩~ 谢谢~ 我再好好研究下你的话~:)

jinglongjanus
2010-08-10 10:51
re:2L

空接口就是没有声明任何方法的接口...

[该贴被jinglongjanus于2010-08-10 10:51修改过]

猜你喜欢