2012-07-24 21 views
11

En Java, ¿cuál es el propósito de usar constructor privado en la clase abstracta?Constructor privado en la clase abstracta

En una crítica recibí esta pregunta, y tengo curiosidad, ¿qué situación debe ser usar el constructor de esa manera?

Creo que se puede usar en pareja con otro constructor en la clase abstracta, pero esto es muy trivial. También se puede usar para construir clases internas estáticas que excederán a la clase abstracta.

¿Tal vez hay un uso más elegante?

+0

No voté en esta pregunta, pero sospecho que la gente que votó en contra se opone a * "Tal vez haya un uso más elegante" * - eso es bastante amplio y suena bastante retórico. – Flexo

+2

La pregunta es: * "En Java, ¿cuál es el propósito de usar constructor privado en clase abstracta?" *. Eso me parece lo suficientemente específico. – assylias

+0

Gracias por responder, probablemente tenga razón. – Chris

Respuesta

27

Si el private constructor es la única constructor de la clase, entonces la razón es clara: para evitar la subclasificación. Algunas clases solo sirven como titulares de campos/métodos estáticos y no desean ser instanciadas o subclasificadas. Tenga en cuenta que el modificador abstract es en este caso redundante — con o sin él no habría instanciación posible. Como señala @JB Nizet a continuación, el modificador abstract también es una mala práctica porque envía señales incorrectas a los clientes de la clase. La clase debería de hecho haber sido final.

Hay otro caso de uso, aunque bastante raro: se puede tener una abstract class con sólo private constructores que contiene sus propias subclases clases como anidados. Este modismo se asegura de que esas clases anidadas sean las únicas subclases. De hecho, enum s en Java usan solo este modismo.

Si hay otros constructores, entonces realmente no hay nada especial acerca del constructor private.Se usa en una clase abstract como en cualquier otra.

+0

Diría que usar abstract en este caso no solo es redundante, sino también confuso. Una clase abstracta, por definición, * se * significa * que se subclasificará. Hacer una clase abstracta, pero no subclassable, muestra una falta de comprensión de para qué sirve el resumen. –

+0

@JBNizet No necesariamente la falta de comprensión, pero tal vez la falta de cuidado para no confundir a sus clientes. Por cierto, tenga en cuenta mi segundo párrafo que acabo de agregar. Esto proporciona la motivación perfecta para el 'privado' ctor en una clase 'abstracta'. –

+2

Buen punto. Pero ya he votado a favor ;-) –

0

ningún otro uso elegante es posible

6

Lo único que puedo pensar es la reutilización de código común compartido por los otros constructores (protegidos). Luego podrían llamar al constructor privado en su primera línea.

2

A veces, el constructor no-arg predeterminado se hace privado, y se proporciona otro constructor que acepta argumentos. Este constructor podría invocar otros constructores privados. Esto obliga a las implementaciones a suministrar estos argumentos, lo que podría asegurar que alguna variable siempre se inicialice, aunque esto no es una práctica común (según mi experiencia). Si este es el requisito, sería mejor que compruebe sus variables y arroje un IllegalArgumentExeption, explicando por qué la variable debe inicializarse.

Si crea una clase abstracta con solo constructores privados, la clase es prácticamente inútil ya que nunca se pueden crear instancias. Si la intención es crear una clase de utilidad con solo métodos estáticos (como la clase Math en el paquete java.lang), los constructores privados son aceptables, sin embargo, la clase debe marcarse como final, ya que marcar la clase como abstracto implica que la clase debe ser extendido.

+2

Sin embargo, si proporciona solo un constructor explícitamente, no hay ningún constructor no-arg por defecto, por lo que esta no es realmente una razón para hacerlo privado. – Thilo

1
  1. Como se mencionó, para ser utilizado como un constructor común de uso interno.

  2. Resumen o no es abstracto, no es raro declarar un constructor predeterminado privado en una clase que contiene solo métodos públicos estáticos [métodos auxiliares] para evitar crear instancias de la clase.

+0

@Thilo - Estoy de acuerdo (3) no aplica, me dejé llevar - eso sería una extensión de (1). 4 está calificado para aclarar que no es directamente aplicable a la pregunta específica. –

Cuestiones relacionadas