1 回答
TA贡献1846条经验 获得超7个赞
我认为这曾经是 AWT 的问题。
IIRC 这些类提供了一个不执行任何操作的默认方法,您可以重载它 - 为了执行诸如发送应用程序正在关闭的任何适当通知、保存任何未保存的数据、释放您存储的任何资源等操作等等等等。
从这个角度来看,这是有道理的。框架不知道您在关闭时要做什么,因此它为您的代码提供了一个位置。
由于这个(或任何“为什么?”问题)有点哲学性,请允许我通过一个简短的转移来深入探讨这个问题,它说明了解决同一问题的不同方法:
在 Mac 上,“代表”有相似但不同的概念。例如,我不会将 Window 子类化,而是将 Window 交给一个“Window-Lifecycle-Delegate-iser”,然后 api 将在发生时调用我的委托上的适当方法。
这在一定程度上对于 Mac 来说效果很好,因为 Objective-C 比 Java 更接近 Smalltalk 风格。特别是,您可以向对象发送一条消息(读作:调用方法),如果该对象没有说出该消息(读作:该对象上没有相应的方法),那么在 Objective-C 中,它就会无处可去,而在爪哇它却尖叫着死去。
因此,在 Java 中,您必须实现接口上的每个方法,而对于 Objective-C,您只需执行您真正关心的方法。因此,您可以创建一个大型 API,其中可能会对委托进行 50-100 次调用,并且您不会让开发人员不知所措,因为他们可以忽略其中的 95-99%。
以下是 Java SE 教程中的一些代码:
public class HelloWorldSwing {
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("HelloWorldSwing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
所以在这里我们看到我们有这个方法,它创建一个 JFrame(一个奇特的窗口),然后立即指定当用户尝试退出时它希望应用程序的行为如何进行。在这种情况下,他们只是选择批量标准选项。
EXIT_ON_CLOSE 不是唯一的选项,您可能会发现查看它们很有趣。
这很重要,因为稍后:
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
我们看到该应用程序正在其自己的线程内运行。
因此,在幕后,计算机有某种无限循环来保持 UI 的活力。这部分需要知道可以打破该循环并让线程死亡。
(invokeLater、Runnable 和 run 都是我们在这里处理线程的线索:D)
添加回答
举报