📄 39.html
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="description" content="Java,JDBC,EJB,Open Source,jdk,rmi">
<meta name="Keywords"
content="Java, servlets, Java servlet, Javascript, ActiveX, VRML,
applet, applets, directory, news, jdbc, applications,
Java applications, Java developer, Java development, developer,
classes, Jars.com, Jars, intranet, Java applet, Javabeans,
Java products, JDK, Java development kit, java development environment, JIT,
JavaPlan, enterprise tools, JVM, Java Virtual Machine, Java resources,
SUN, CGI, Perl, database, network, html,
xml, dhtml, rating, ratings, review, jars, cgi, programming,
software review, software rating">
<title>csdn_用 Java 实现回调例程</title>
<style>
.news { BACKGROUND: #007cd3; font-family: "宋体"; font-size: 9pt }
.t { font-family: "宋体"; font-size: 9pt }
.t1 { color:#007cd3; font-family: "宋体"; font-size: 9pt }
.white { font-family: "宋体"; font-size: 9pt;color:#FFFFFF }
.red { font-family: "宋体"; font-size: 9pt;color:#FF0000 }
A:visited {color:#0000FF}
A:hover {color: #ff6666; text-decoration: none}
.text {font-size: 12px; line-height: 160%; font-family: "宋体"}
.text1 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text1:visited {color:#000000}
.text1:hover {color: #000000}
.text2 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text2:visited {color:#000000}
.text2:hover {color: #000000}
.text3 {font-size: 12px; line-height: 100%; font-family: "宋体"; text-decoration: none}
.large {font-size: 14.8px; line-height: 130%}
</style>
</head>
<body
<center>
<tr>
<td WIDTH="100%" VALIGN="TOP">
<tr>
<td WIDTH="100%" CLASS="white"></td>
</tr>
<tr>
<td WIDTH="50%" bordercolor="#FFFFFF" CLASS="t1" bgcolor="#F0F0F0" align="center" nowrap>用 Java 实现回调例程 </td>
<p> <td WIDTH="50%" bordercolor="#FFFFFF" CLASS="t1" bgcolor="#F0F0F0" align="center" nowrap>作者:John D. Mitchell </td></p>
</tr>
<tr> <td WIDTH="100%" bordercolor="#FFFFFF" CLASS="t" bgcolor="#F0F0F0" colspan="2">
<BLOCKQUOTE><STRONG>摘要</STRONG><BR>在 Java 支持方法指针之前,Java
接口不能提供一种实现回调的好方法。如果您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧。<EM></EM> </BLOCKQUOTE><!-- begin body text -->熟悉 MS-Windows 和 X Window System
事件驱动编程模型的开发人员,习惯于传递在某种事件发生时调用(即“回调”)的函数指针。Java
的面向对象模型目前并不支持方法指针,这样似乎就不可能使用这种很好的机制。但我们并不是一点办法都没有!
<P>Java 的<EM>接口</EM>支持提供了一种获得回调的等价功能的机制。其技巧就是:定义一个简单接口,并在该接口中声明我们要调用的方法。
<P>例如,假定我们希望在某个事件发生时得到通知。我们可以定义一个接口:
<P><CODE>public interface InterestingEvent<BR>{<BR> //
这仅是一个常规方法。因此如果需要,<BR> //
它可有返回值,也可接收参数。<BR> public void interestingEvent
();<BR>}<BR></CODE>
<P>这使得我们可以控制<EM>实现</EM>该接口的类的任何对象。因此,我们不必关心任何外部类型信息。与在将 C++ 代码用于 Motif
时使用窗口小部件的<EM>数据</EM>域来容纳对象指针的难以控制的 C 函数相比,这种方法要好得<EM>多</EM>。
<P>发出事件信号的类必须等待实现了 <STRONG>InterestingEvent</STRONG> 接口的对象,并在适当时候调用
<STRONG>interestingEvent()</STRONG> 方法。
<P><CODE>public class EventNotifier<BR>{<BR> private
InterestingEvent ie;<BR> private boolean
somethingHappened;<BR><BR> public EventNotifier
(InterestingEvent event)<BR> {<BR> // 保存事件对象以备后用。<BR> ie =
event;<BR><BR> // 还没有要报告的事件。<BR> somethingHappened =
false;<BR> }<BR><BR> //...
<BR><BR> public void doWork ()<BR> {<BR> //
检查在别处设置的谓词。<BR> if
(somethingHappened)<BR> {<BR> //
通过调用接口的这个方法发出事件信号。<BR> ie.interestingEvent
();<BR> }<BR> //...<BR> }<BR><BR> //
...<BR>}<BR></CODE>
<P>在上例中,我使用 <STRONG>somethingHappened</STRONG> 谓词来跟踪是否应触发事件。在许多情况下,调用此方法足以保证向
<STRONG>interestingEvent()</STRONG> 发出信号。
<P>希望接收事件通知的代码必须实现 <STRONG>InterestingEvent</STRONG> 接口,并将自身引用传递给事件通知程序。
<P><CODE>public class CallMe implements
InterestingEvent<BR>{<BR> private EventNotifier
en;<BR><BR> public CallMe ()<BR> {<BR> //
创建事件通知程序,并将自身引用传递给它。<BR> en = new EventNotifier
(this);<BR> }<BR><BR> //
为事件定义实际的处理程序。<BR> public void interestingEvent
()<BR> {<BR> // 噢!必定发生了感兴趣的事件!<BR> // 执行某些操作
...<BR> }<BR><BR> //...<BR>}<BR></CODE></P>
</td>
</tr>
</td>
</tr>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -