【问题标题】:Why we use init() rather Constructor为什么我们使用 init() 而不是构造函数
【发布时间】:2012-02-21 16:36:27
【问题描述】:

为什么我们需要init() 而不是constructor

请参考ServletApplet回答。
Appletinit()Servlet 有何不同?

【问题讨论】:

标签: java servlets applet


【解决方案1】:

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 更改为initializesprepares
  • 以上是正确的,我要补充一点,拆分对象创建和初始化允许servlet容器对不同的请求重复使用相同的servlet实例,减少时间和内存消耗。
  • @madth3:applets 呢?
【解决方案2】:

两者都需要,但它们执行不同的活动,您的构造函数在通过调用 new 创建对象时执行,但对于某些类型的对象,您无法控制它们的创建,或者您宁愿执行一些代码不仅在对象被创建之后而且被完全初始化之后,那么你需要一个特殊的方法,有人会调用它来表示对象已经准备好了。

对于不是由您管理,而是由服务器、框架或管理这些对象的任何人管理的对象,情况尤其如此。

您应该将此方法视为在此对象将在构造函数上执行的代码之上为您提供的商品

【讨论】:

    【解决方案3】:

    这是一种设计选择。 servlet 规范说您必须提供一个无参数构造函数,并且您可以覆盖 init() 方法来执行初始化任务。他们本可以选择不这样做,并要求 servlet 有一个可以选择抛出 ServletException 的单参数构造函数 (ServletConfig)。从技术上讲,这没有问题,因为反射 API 允许您调用在类中声明的任何构造函数。

    但是拥有init() 方法允许servlet 容器预先实例化对象并延迟它们的初始化。它有助于区分生命周期的不同阶段。

    就我个人而言,我不认为这是一个强有力的设计选择。让 Web 应用程序为 servlet 容器提供预实例化的 servlet,而不是让容器调用各种 servlet 的构造函数会方便得多。

    【讨论】:

    • 顺便说一句,只要你的初始化代码不依赖于 ServletContext 或 servlet 配置,你可以将代码放在无参数构造函数中。
    【解决方案4】:

    init() 方法只被调用一次,因此只会创建一个控件实例。

    【讨论】:

      猜你喜欢
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2015-06-10
      相关资源
      最近更新 更多