![translation](https://cdn.durumis.com/common/trans.png)
Esta es una publicación traducida por IA.
[Effective Java] Item 4. Use a private constructor to prevent instantiation
- Idioma de escritura: Coreano
- •
-
País de referencia: Todos los países
- •
- Tecnología de la información
Seleccionar idioma
Texto resumido por la IA durumis
- Cuando se crea una clase de utilidad que contiene solo métodos y campos estáticos, el constructor debe hacerse privado para evitar la creación de instancias.
- Esto evita que se llame al constructor desde fuera de la clase y permite controlar explícitamente el constructor predeterminado público que el compilador genera automáticamente.
- Un constructor privado hace que la herencia sea imposible, por lo que se puede limitar el uso intencional de la clase de utilidad y mejorar la legibilidad del código.
A veces es útil utilizar una clase que contiene solo métodos estáticos y campos estáticos.
Como ejemplo, podemos usar clases de utilidad como java.lang.Math, java.util.Arrays, que contienen métodos relacionados con operaciones matemáticas o arreglos. O también podemos agregar métodos de factoría estáticos que crean objetos que implementan una interfaz específica como java.util.Collections.
Estas clases de utilidad no requieren un constructor porque no tienen variables de instancia o métodos, pero si no se especifica un constructor, el compilador crea automáticamente un constructor público por defecto. Entonces, el usuario no puede distinguir si el constructor se creó automáticamente.
Para evitar esto, a veces se utiliza una clase abstracta, pero una clase abstracta no puede evitar la instanciación. Esto se debe a que solo se debe crear una subclase para instanciarla.
public abstract class Person {
public static void speak(String message) {
System.out.println(message);
}
}
public class Student extends Person {
public Student() {
super();
}
Por lo tanto, para evitar la instanciación de una clase de utilidad, el modificador de acceso del constructor debe establecerse como privado.
public abstract class Person {
private Person() {
throw new AssertionError();
}
public static void speak(String message) {
System.out.println(message);
}
Si el modificador de acceso del constructor por defecto es privado, no se puede acceder desde fuera de la clase. Además, se ha bloqueado para que no se produzca una excepción si el constructor por defecto se llama internamente.
Este constructor privado puede dificultar la comprensión del constructor desde el punto de vista del usuario, por lo que es bueno agregar un comentario. Como referencia, bloquear el constructor como privado también tiene el efecto de hacer que la herencia sea imposible.