为什么HTTPServlet是一个抽象类?任何功能原因?

HttpServlet是包含所有已实现方法的抽象类。为什么它是抽象的?

我得到的最常见的答案是,限制 的实例化。但是还有其他方法可以做到这一点,比如私有构造函数将限制实例化。HttpServlet

我可以理解他们正在遵循模板方法设计模式。如果某些方法是抽象的,则用户最终将实现所有这些方法,即使他的业务逻辑不需要它们。

但是,如果不是抽象的,用户仍然可以扩展它并重写所需的方法。HttpServlet

至少从“抽象”这个词的字典含义来看,对我来说,拥有一个包含所有实现方法的抽象类没有任何意义。

是的,抽象和具体方法的结合是可以的。

但是,如果你正在使一个类抽象,为什么不使这些方法抽象为子类必须重写的呢?或者可能根本不声明它是抽象的?

就像或就是这种情况。doGet()doPost()


答案 1

要具有任何有用的行为,预计您必须重写这些方法。HttpServlet本身没有有用的功能。

将其构造函数设为私有将限制创建子类的能力。

HttpServlet的设计可能并不理想 - 因为在许多页面上,特别是表单,GET和POST逻辑应该至少部分地沿着一条共同的道路进行。然而,HttpServlet的设计思想是提供,等等的实现,根据HTTP版本回答“不支持”的错误。如果您需要返回这样的答案,则这些存根将非常有用。doGet()doPost()

总而言之,API/接口是完整的 - 但功能肯定不是。因此,它被声明为抽象


答案 2

HTTPServlet 是一个抽象类,包含所有已实现的方法。那么为什么它是抽象的呢?

它是抽象的,因为关键方法的实现必须由自定义 servlet 类提供(例如,由自定义 servlet 类重写)。正如javadoc所说:

HttpServlet 的子类必须覆盖至少一个方法,通常是以下方法之一:

  • doGet,如果 servlet 支持 HTTP GET 请求
  • doPost, for HTTP POST requests
  • doPut, for HTTP PUT 请求
  • doDelete, for HTTP DELETE REQUEST
  • 初始化和销毁,以管理在 servlet 生命周期内保留的资源
  • getServletInfo,servlet 用它来提供有关自身的信息

如果你在不重写任何方法的情况下扩展类,你会得到一个无用的servlet;即为所有请求提供错误响应的一个。类似地,如果类不是 ,那么任何直接的实例都将是无用的。abstractHttpServlet

因此,创建类的原因是防止(天真的)程序员错误。HttpServletabstract


为了记录,提供所有方法的实现的原因是通过提供默认行为使程序员的生活更简单。例如,如果我不希望我的 servlet 支持 DELETE 请求,则 的默认实现将方便地发送带有“方法不受支持”响应代码的响应。doDelete


推荐