tipos - ¿Puede un constructor en Java ser privado?
que es un destructor en java (15)
¿Puede un constructor ser privado? ¿Cómo es útil un constructor privado?
Sí puede. Considero este otro ejemplo de ser ú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<? extends ErrorTypeException> toExceptionClass(ErrorType errorType) {
switch (errorType) {
case X:
return Xx.class;
case Y:
return Yx.class;
default:
return Zx.class;
}
}
}
En el caso anterior, evita que la clase abstracta sea instanciada por cualquier clase derivada que no sea su clase interna estática. Las clases abstractas no pueden ser definitivas, pero en este caso el constructor privado hace que sea efectivamente final para todas las clases que no sean clases internas
¿Puede un constructor ser privado? ¿Cómo es útil un constructor privado?
Bueno, si todos sus métodos en una clase son estáticos, entonces un constructor privado es una buena idea.
Esperaba que alguien hubiera mencionado esto (el segundo punto), pero ... hay tres usos de los constructores privados:
Para evitar la creación de instancias fuera del objeto, en los siguientes casos:
- semifallo
- método de fábrica
- clase solo-métodos-estáticos (utilidad)
- clase de constantes solamente
.
Para evitar la subescala (extensión). Si solo creas un constructor privado, ninguna clase puede extender tu clase, porque no puede llamar al constructor
super()
. Este es un sinónimo definal
Constructores sobrecargados: como resultado de los métodos de sobrecarga y de los constructores, algunos pueden ser privados y otros públicos. Especialmente en el caso de que haya una clase no pública que use en sus constructores, puede crear un constructor público que cree una instancia de esa clase y luego la pase a un constructor privado.
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 infiere que uno está instanciando intencionalmente.
Los Constructores privados pueden definirse en Java por los siguientes motivos
Para tener control sobre la creación de instancias de los objetos Java, no le permitirá crear una instancia de un objeto.
No permitirá que la clase sea subclasificada
Esto tiene una ventaja especial cuando se implementa el patrón de singleton , se utilizan contstructores privados para él y tienen un control sobre la creación de la instancia para toda la aplicación.
cuando desee tener una clase con todas las constantes definidas y no requiera más su instancia, entonces declaramos esa clase como un constructor privado.
Los constructores privados evitan que las personas que llaman generen una instancia explícita de una clase; consulte más información sobre here
Sí puede. Existiría un constructor privado para evitar que se cree una instancia de la clase, o porque la construcción ocurre solo internamente, por ejemplo, un patrón de Fábrica. Vea here para más información.
Sí, la clase puede tener un constructor privado. Es necesario para no permitir acceder al constructor desde otras clases y mantenerlo accesible dentro de la clase definida.
¿Por qué querrías que los objetos de tu clase solo fueran creados internamente? Esto se puede hacer por cualquier motivo, pero un posible motivo es que desea implementar un singleton. Un singleton es un patrón de diseño que permite que solo se cree una instancia de su clase, y esto se puede lograr usando un constructor privado.
Sí, un constructor puede ser privado. Hay diferentes usos de esto. Un uso de este tipo es para el diseño de patrón único , que no recomendaría que utilice. Otro uso más legítimo es delegar constructores; puede tener un constructor que toma muchas opciones diferentes que es realmente un detalle de implementación, por lo que lo hace privado, pero luego los constructores restantes lo delegan.
Como ejemplo de delegación de 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 que el constructor general sea privado para garantizar que solo se usen 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
Mirando esta respuesta varios años después, me gustaría señalar que esta respuesta es incompleta y también un poco extrema. Los singletones son de hecho un anti-patrón y generalmente deben evitarse cuando sea posible; sin embargo, hay muchos usos de constructores privados además de singletons, y mi respuesta solo nombra uno.
Para dar un par de casos más donde se utilizan constructores privados:
Para crear una clase que no se puede demostrar que es solo una colección de funciones estáticas relacionadas (esto es básicamente un singleton, pero si no tiene estado y las funciones estáticas operan estrictamente en los parámetros en lugar de en el estado de la clase, este no es un enfoque tan irrazonable como mi el yo anterior parece sugerir, aunque el uso de una interfaz que es la dependencia inyectada a menudo facilita el mantenimiento de la API cuando la implementación requiere un mayor número de dependencias u otras formas de contexto.
Cuando hay varias 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 como
new ArrayList(5)
oArrayList.createWithCapacity(5)
,ArrayList.createWithContents(5)
,ArrayList.createWithInitialSize(5)
). En otras palabras, un constructor privado le permite proporcionar funciones de fábrica cuyos nombres son más comprensibles, y luego hacer que el constructor sea privado garantiza que las personas usen solo los nombres más evidentes. Esto también se usa comúnmente con el patrón de constructor . Por ejemplo:MyClass myVar = MyClass .newBuilder() .setOption1(option1) .setOption2(option2) .build();
Sí, y se utiliza para evitar la creación de instancias y, posteriormente, anular. Esto se utiliza más a menudo en clases singleton.
Sí. La clase puede tener constructor privado. Incluso la clase abstracta puede tener constructor privado.
Al hacer que el constructor sea privado, evitamos que se cree una instancia de la clase así como una subclase de esa clase.
Éstos son algunos de los usos del constructor privado:
- Patrón de diseño Singleton
- Para limitar el número de creación de instancias.
- Para dar un nombre significativo para la creación de objetos usando el método de fábrica estático
- Clase de utilidad estática o clase constante
- Para evitar subclases
- Patrón de diseño del constructor y por lo tanto para crear clases inmutables.
Sí.
Esto es para que pueda controlar cómo se crea una instancia de la clase. Si hace que el constructor sea privado y luego crea un método de constructor visible que devuelve instancias de la clase, puede hacer cosas como limitar el número de creaciones (normalmente, garantiza que hay exactamente una instancia) o reciclar instancias u otras tareas relacionadas con la construcción .
Hacer una new x()
nunca devuelve un null
, pero al usar el patrón de fábrica, puede devolver un null
, o incluso devolver diferentes subtipos.
También puede usarlo para una clase que no tenga miembros de instancia o propiedades, solo estáticas, como en una clase de función de utilidad.
Sí.
Se utiliza un constructor privado para evitar la inicialización de la instancia, como la clase final de Matemáticas que usa en java. Singleton también utiliza constructor privado.
Según yo, podemos declarar el constructor como privado y también podemos obtener la instancia de esa clase en la subclase usando un 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 desde a la subclase usando classname.method
name bcz es un método estático y obtendremos la instancia de la clase en la que declaramos const.
Si un constructor puede ser privado. Un constructor privado evita que cualquier otra clase cree un ejemplo de constructor privado
public class CustomHttpClient {
private static HttpClient customHttpClient;
/** A private Constructor prevents any other class from instantiating. */
private CustomHttpClient() {
}}