2010-01-31 21 views
6

Tengo una duda con respecto a la clase HttpServlet es una clase abstracta aunque no haya ningún método abstracto en la clase, todos los métodos son concretos. ¿Puede la clase ser abstracta incluso si no tiene ningún método abstracto? Si es así, ¿cuál es el uso?¿Puede la clase ser abstracta incluso si no tiene ningún método abstracto? Si es así, ¿cuál es el uso?

Gracias

+0

Véase también http://stackoverflow.com/questions/362446/abstract-class-with-all-concrete-methods –

Respuesta

18

En el caso de HttpServlet, el punto es que los programadores de servlets normalmente no quieren que su servlet soporte todos los 4 de los principales métodos HTTP (POST, GET, PUT, DELETE), por lo que sería molesto hacer que doGet(), doPost(), etc. métodos abstractos, ya que los programadores se verían obligados a implementar métodos que no necesitan. Por lo tanto, HttpServlet proporciona una implementación predeterminada para todos los métodos que no hace nada excepto devolver un código de estado de error al cliente. Los programadores pueden anular los métodos que necesitan y no preocuparse por el resto. Pero en realidad el uso de la clase HttpServlet en sí no tiene sentido (ya que no sirve de nada), por lo que es abstract.

Y ahí tienes un gran ejemplo para cuando puede tener sentido tener una clase abstracta sin ningún método abstracto.

+0

Es de hecho un gran ejemplo. Por cierto, también se lo conoce como patrón de método de plantilla. – BalusC

6

uno no puede crear instancias de clases abstractas lo que tiene que subclasificarlos con el fin de usarlo.
En la subclase aún puede implementar sus propios métodos o anular los métodos principales.

Quizás no tenga sentido utilizar HttpServlet como independiente, pero proporciona la funcionalidad predeterminada necesaria en un contexto determinado. Puede crear la subclase HttpServlet para atender este contexto y tener acceso a su funcionalidad.

Una subclase de HttpServlet no tiene que implementar métodos para hacer que su propia funcionalidad funcione.

3

Es una cuestión de intenciones. Si la clase es abstracta, no puede crear una instancia de esa clase, solo de una subclase.

No soy fuerte en Java, pero supongo que HttpServlet proporciona implementaciones predeterminadas de sus métodos, pero se espera que anule algunos de ellos. Todavía tiene poco sentido tener una instancia no especializada de esa clase, por lo que es abstracta, por lo que el compilador deja caer una pista a cualquiera que lo intente.

+0

+1, El comportamiento predeterminado de los métodos de 'HttpServlet' daría lugar a * muy * web aburrida páginas ... –

+0

Seguramente no es tan aburrido como http://www.cavaliers.org/john/boring.html? – Steve314

2

Marcar una clase como resumen incluso cuando hay una implementación concreta para todos los métodos sería útil en casos donde no está seguro de si el diseño de la clase está completo o existen posibilidades de que desee agregar algunos métodos más adelante. Cambiar una clase que ha sido declarada abstracta para ser elaborada no abstracta más tarde no rompe la compatibilidad con los binarios preexistentes donde, a la inversa, se rompe la compatibilidad.

Cuestiones relacionadas