¿Puede un constructor en Java ser privado?

¿Puede un constructor ser privado? ¿Cómo es útil un constructor privado?

Sí, un constructor puede ser privado. Hay diferentes usos de esto. Uno de estos usos es para el diseño único antipatrón , que yo desaconsejaría que usara. Otro uso más legítimo es delegar constructores; puede tener un constructor que tome muchas opciones diferentes que realmente es un detalle de implementación, por lo que lo hace privado, pero luego sus constructores restantes lo delegan.

Como ejemplo de delegar constructores, la siguiente clase le permite guardar un valor y un tipo, pero solo le permite hacerlo para un subconjunto de tipos, por lo que es necesario hacer que el constructor general sea privado para garantizar que solo se utilicen los tipos permitidos. . El constructor privado común ayuda a reutilizar el código.

 public class MyClass { private final String value; private final String type; public MyClass(int x){ this(Integer.toString(x), "int"); } public MyClass(boolean x){ this(Boolean.toString(x), "boolean"); } public String toString(){ return value; } public String getType(){ return type; } private MyClass(String value, String type){ this.value = value; this.type = type; } } 

Editar
Al ver esta respuesta de varios años más tarde, me gustaría señalar que esta respuesta es incompleta y también un poco extrema. Los singleton son de hecho un antipatrón y en general deben evitarse siempre que sea posible; sin embargo, hay muchos usos de constructores privados además de singletons, y mi respuesta nombra solo uno.

Para dar un par de casos más donde se utilizan constructores privados:

  1. Para crear una clase no ejecutable que sea simplemente una colección de funciones estáticas relacionadas (esto es básicamente un singleton, pero si es sin estado y las funciones estáticas operan estrictamente en los parámetros en lugar del estado de la clase, esto no es un enfoque tan irracional como mi Parecería sugerir un yo anterior, aunque usar una interfaz que es una dependency injection a menudo hace que sea más fácil mantener la API cuando la implementación requiere un gran número de dependencias u otras formas de contexto.

  2. Cuando existen múltiples formas diferentes de crear el objeto, un constructor privado puede facilitar la comprensión de las diferentes formas de construirlo (por ejemplo, que es más legible para usted new ArrayList(5) o ArrayList.createWithCapacity(5) , ArrayList.createWithContents(5) , ArrayList.createWithInitialSize(5) ). En otras palabras, un constructor privado le permite proporcionar funciones de fábrica cuyos nombres sean más comprensibles y, a continuación, hacer que el constructor sea privado garantiza que las personas solo usen los nombres más evidentes. Esto también se usa comúnmente con el patrón del constructor . Por ejemplo:

     MyClass myVar = MyClass .newBuilder() .setOption1(option1) .setOption2(option2) .build(); 

Esperaba que alguien hubiera mencionado esto (el segundo punto), pero … hay tres usos de constructores privados:

  • para evitar la creación de instancias fuera del objeto, en los siguientes casos:

    • semifallo
    • método de fábrica
    • static-methods-only (utility) class
    • clase de constantes solamente
      .
  • para evitar la sublimación (extensión). Si solo hace un constructor privado, ninguna clase puede extender su clase, porque no puede llamar al constructor super() . Este es un tipo de sinónimo de final

  • constructores sobrecargados: como resultado de métodos de sobrecarga y constructores, algunos pueden ser privados y otros públicos. Especialmente en el caso de que exista una clase no pública que utilice en sus constructores, puede crear un constructor público que cree una instancia de esa clase y luego la pase a un constructor privado.

Sí puede. Un constructor privado existiría para evitar que la clase sea instanciada, o porque la construcción ocurre solo internamente, por ejemplo, un patrón de fábrica. Mira aquí para más información.

Sí.

Esto es para que pueda controlar cómo se instancia la clase. Si convierte el constructor en privado y luego crea un método constructor visible que devuelve instancias de la clase, puede hacer cosas como limitar el número de creaciones (generalmente, garantizar que haya exactamente una instancia) o reciclar instancias u otras tareas relacionadas con la construcción. .

Hacer una new x() nunca devuelve null , pero usando el patrón de fábrica, puede devolver null , o incluso devolver diferentes subtipos.

Puede usarlo también para una clase que no tenga miembros o propiedades de instancia, solo elementos estáticos, como en una clase de función de utilidad.

Bueno, si todos sus métodos en una clase son estáticos, entonces un constructor privado es una buena idea.

Los constructores privados se pueden desactivar en Java por los siguientes motivos

  1. Para tener control sobre la creación de instancias de los objetos Java, no le permitirá crear una instancia de un objeto.

  2. No permitirá que la clase sea subclasificada

  3. Esto tiene una ventaja especial cuando se implementa el Patrón singleton , los contstructors privados se usan para ello y tienen un control sobre la creación de la instancia para toda la aplicación.

  4. cuando quiere tener una clase con todas las constantes definidas y ya no requiere su instancia, entonces declaramos esa clase como un constructor privado.

Algunas razones por las que puede necesitar un constructor privado: solo se puede acceder al constructor desde el método de fábrica estático dentro de la propia clase. Singleton también puede pertenecer a esta categoría. Una clase de utilidad , que solo contiene métodos estáticos.

Sí.

Se utiliza un constructor privado para evitar la inicialización de la instancia, como la clase final de Matemáticas que utiliza en Java. Singleton también usa constructor privado

Sí. La clase puede tener un constructor privado. Incluso la clase abstracta puede tener un constructor privado.

Al hacer que el constructor sea privado, evitamos que se cree una instancia de la clase, así como la creación de subclases de esa clase.

Estos son algunos de los usos del constructor privado:

  1. Patrón de diseño Singleton
  2. Para limitar el número de creación de instancia
  3. Para dar un nombre significativo para la creación de objetos usando el método de fábrica estático
  4. Static Utility Class o Constant Class
  5. Para evitar Subclases
  6. Patrón de diseño del constructor y por lo tanto para crear clases inmutables

Sí, la clase puede tener un constructor privado. Es necesario no permitir el acceso al constructor desde otras clases y permanecer accesible dentro de la clase definida.

¿Por qué querrías que los objetos de tu clase solo se crearan internamente? Esto podría hacerse por cualquier motivo, pero una posible razón es que desee implementar un singleton. Un singleton es un patrón de diseño que permite crear solo una instancia de su clase, y esto se puede lograr utilizando un constructor privado.

Sí y se usa para evitar la creación de instancias y, posteriormente, anular. Esto se usa con mayor frecuencia en clases singleton.

sí, un constructor puede ser privado. Un Constructor privado impide que cualquier otra clase instanciando ejemplo de constructor privado

 public class CustomHttpClient { private static HttpClient customHttpClient; /** A private Constructor prevents any other class from instantiating. */ private CustomHttpClient() { }} 

Los constructores privados evitan que los llamadores creen una instancia explícita de una clase. Ver más información sobre PrivateConstructor

La idea básica detrás de tener un constructor privado es restringir la creación de instancias de una clase desde afuera por JVM, pero si una clase tiene un constructor de argumentos, entonces deduce que uno está creando instancias intencionales.

Según yo, podemos declarar constructor como privado y también podemos obtener la instancia de esa clase en la subclase utilizando el método estático en la clase en la que declaramos el constructor y luego devolvemos el objeto de la clase. clasificamos este método de a la subclase utilizando classname.method name bcz es un método estático y obtendremos la instancia de clase en la que declaramos const.

¿Puede un constructor ser privado? ¿Cómo es útil un constructor privado?

Sí puede. Considero que este es otro ejemplo de que es útil:

 //... ErrorType.java public enum ErrorType { X, Y, Z } //... ErrorTypeException.java import java.util.*; import java.lang.*; import java.io.*; //Translates ErrorTypes only abstract public class ErrorTypeException extends Exception { private ErrorTypeException(){} //I don't want to expose thse static private class Xx extends ErrorTypeException {} static private class Yx extends ErrorTypeException {} static private class Zx extends ErrorTypeException {} // Want translation without exposing underlying type public static Exception from(ErrorType errorType) { switch (errorType) { case X: return new Xx(); case Y: return new Yx(); default: return new Zx(); } } // Want to get hold of class without exposing underlying type public static Class toExceptionClass(ErrorType errorType) { switch (errorType) { case X: return Xx.class; case Y: return Yx.class; default: return Zx.class; } } } 

En el caso anterior, impide que la clase abstracta sea instanciada por cualquier clase derivada que no sean sus clases internas estáticas. Las clases abstractas no pueden ser definitivas, pero en este caso el constructor privado lo hace eficazmente final para todas las clases que no son clases internas