为什么我们使用init()而不是构造函数?

6

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

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


可能是Servlet构造函数和init()方法的重复问题。 - BalusC
1
这是两个问题。你应该在一个问题里问一个问题。 - BalusC
4个回答

12
init() 方法创建并加载 Servlet。但是,Servlet 实例首先通过构造函数(由 Servlet 容器执行)创建。在 Servlet 中,我们不能编写带有参数的构造函数(这会抛出异常)。所以,他们提供了一个接受 ServletConfig 对象作为参数的 init() 方法。ServletConfig 对象提供有关其初始化(init)参数的信息。Servlet 类不能声明带有 ServletConfig 对象作为参数的构造函数,也无法访问 ServletConfig 对象。
更多信息请参见:http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets6.html

2
根据您的参考,我会将“creates and loads”更改为“initializes”或“prepares”。 - madth3
以上是正确的,我想补充一点,将对象的创建和初始化分开可以让Servlet容器在不同的请求中重复使用同一个Servlet实例,从而减少时间和内存的消耗。 - madth3
@madth3:applet怎么样? - Mohammad Faisal
基本上是同样的原因:http://www.javaworld.com/javaworld/javaqa/1999-10/04-qa-appletconst.html - Massimiliano Peluso

2
您需要两者都有,但它们执行不同的活动。构造函数在通过调用new创建对象时执行,但对于某些类型的对象,您无法控制它们的创建,或者您更愿意执行一些代码,而不仅仅是在对象被创建后,而是完全初始化后,那么您需要一个特殊的方法,某人将调用该方法以表示对象已准备就绪。
这特别适用于不由您管理,而是由服务器、框架或其他人员管理的对象。
您应该将这些方法视为在构造函数上提供给您的便利。

2
这是一种设计选择。Servlet规范要求您必须提供一个无参构造函数,并且可以重写init()方法执行初始化任务。他们本来可以选择另一种方式并要求servlet具有单个参数构造函数(ServletConfig),它可以选择抛出ServletException。从技术上讲,这没有问题,因为反射API允许您调用类中声明的任何构造函数。
然而,拥有init()方法可以使servlet容器预先实例化对象并延迟其初始化。它有助于将生命周期的不同阶段分开。
个人而言,我认为这不是一个很好的设计选择。更方便的做法是让Web应用程序向servlet容器提供预先实例化的servlet,而不是让容器调用各种servlet的构造函数。

顺便提一下,只要您的初始化代码不依赖于ServletContext或servlet config,您就可以将代码放在无参构造函数中。 - gawi

0

init()方法仅被调用一次,因此控件的唯一实例将被创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接