【发布时间】:2012-02-21 16:36:27
【问题描述】:
为什么我们需要init() 而不是constructor?
请参考Servlet和Applet回答。Applet 的 init() 与 Servlet 有何不同?
【问题讨论】:
-
这是 2 个问题。你应该在一个问题中问一个问题。
为什么我们需要init() 而不是constructor?
请参考Servlet和Applet回答。Applet 的 init() 与 Servlet 有何不同?
【问题讨论】:
init() 方法创建并加载 servlet。但是 servlet 实例首先是通过构造函数创建的(由 Servlet 容器完成)。我们不能在 servlet 中编写带有参数的 servlet 类的构造函数(它会抛出异常)。因此,他们提供了一个接受 ServletConfig 对象作为参数的init() 方法。 ServletConfig 对象为 servlet 提供有关其初始化 (init) 参数的信息。 Servlet 类不能以 ServletConfig 对象为参数声明构造函数,也不能访问 ServletConfig 对象。
更多信息请访问:http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets6.html
【讨论】:
creates and loads 更改为initializes 或prepares。
applets 呢?
两者都需要,但它们执行不同的活动,您的构造函数在通过调用 new 创建对象时执行,但对于某些类型的对象,您无法控制它们的创建,或者您宁愿执行一些代码不仅在对象被创建之后而且被完全初始化之后,那么你需要一个特殊的方法,有人会调用它来表示对象已经准备好了。
对于不是由您管理,而是由服务器、框架或管理这些对象的任何人管理的对象,情况尤其如此。
您应该将此方法视为在此对象将在构造函数上执行的代码之上为您提供的商品
【讨论】:
这是一种设计选择。 servlet 规范说您必须提供一个无参数构造函数,并且您可以覆盖 init() 方法来执行初始化任务。他们本可以选择不这样做,并要求 servlet 有一个可以选择抛出 ServletException 的单参数构造函数 (ServletConfig)。从技术上讲,这没有问题,因为反射 API 允许您调用在类中声明的任何构造函数。
但是拥有init() 方法允许servlet 容器预先实例化对象并延迟它们的初始化。它有助于区分生命周期的不同阶段。
就我个人而言,我不认为这是一个强有力的设计选择。让 Web 应用程序为 servlet 容器提供预实例化的 servlet,而不是让容器调用各种 servlet 的构造函数会方便得多。
【讨论】:
init() 方法只被调用一次,因此只会创建一个控件实例。
【讨论】: