roc*_*amp 11 java abstract-class servlets private-constructor
HttpServlet是一个包含所有实现方法的抽象类.为什么它是抽象的?
我得到的最常见的答案是,限制实例化HttpServlet.但是还有其他方法可以做到这一点,就像私有构造函数会限制实例化一样.
我可以理解他们正在遵循模板方法设计模式.如果某些方法是抽象的,那么即使用户的业务逻辑不需要它们,用户也会最终实现所有这些方法.
但如果HttpServlet不是抽象的,用户仍然可以扩展它并覆盖require方法.
至少通过"抽象"这个词的字典含义,对我来说,拥有一个带有所有实现方法的抽象类并没有任何意义.
是的,抽象和具体方法的组合是可以的.
但是如果你正在创建一个类抽象,为什么不将这些方法抽象为子类必须覆盖的呢?或者可能根本没有宣布它是抽象的?
喜欢doGet()或是doPost()这种情况.
Tho*_*s W 13
要获得任何有用的行为,您需要覆盖这些方法.HttpServlet本身没有有用的功能.
使其构造函数成为私有将限制创建子类的能力.
HttpServlet的设计可能并不理想 - 因为在许多页面上,特别是形式,GET和POST逻辑应该至少部分地沿着共同的路径前进.然而HttpServlet的的设计理念是为了提供doGet(),doPost()等实现接听根据HTTP版本"不支持"的错误.如果您需要返回这样的答案,这些存根将对继承很有用.
总之,API /接口是完整的 - 但功能绝对不是.因此它被宣布为抽象的.
HTTPServlet是一个包含所有实现方法的抽象类.那为什么它是抽象的?
它是抽象的,因为关键方法的实现必须由自定义servlet类提供(例如,重写).正如javadoc所说:
HttpServlet的子类必须至少覆盖一个方法,通常是以下方法之一:
- doGet,如果servlet支持HTTP GET请求
- doPost,用于HTTP POST请求
- doPut,用于HTTP PUT请求
- doDelete,用于HTTP DELETE请求
- init和destroy,用于管理servlet生命周期中持有的资源
- getServletInfo,servlet用于提供有关自身的信息
如果你扩展类而不重写任何方法,你将得到一个无用的servlet; 即为所有请求提供错误响应的.同样,如果班级没有abstract,那么任何直接的实例HttpServlet都是无用的.
因此,制作HttpServlet类的原因abstract是为了防止(幼稚)程序员错误.
为了记录,提供所有方法的实现的原因是通过提供默认行为使程序员的生活更简单.例如,如果我不希望我的servlet支持DELETE请求,则默认实现doDelete将方便地发送带有"Method not supported"响应代码的响应.
| 归档时间: |
|
| 查看次数: |
10761 次 |
| 最近记录: |