Creando generador de nombres de clase en Java
Tengo bastantes problemas para dar nombre automáticamente a las variables en Java.
El problema en cuestión:
Estoy creando una clase Point (diferente de java.awt.Point
). Tiene un atributo this.name
. Desde un archivo testPoint.java
, simplemente creo un Point
e imprimo su nombre.
Para crear un Point tengo dos constructores enlazados:
public Point() {
this("AutoName");
}
public Point(String name) {
this.name = name;
}
Si se proporciona un nombre en el archivo testPoint.java
, el punto se nombrará según ese nombre. Si no se proporciona un nombre, el Point se llamará AutoName
.
Lo que quiero es que, si no se proporciona ningún nombre, el primer Point sin nombre tenga AutoName1
como nombre, el segundo AutoName2
, etc.
¿Hay alguna forma de hacerlo sin introducir nuevas clases? Sería fácil si pudiera crear una variable global en Java como en C y Python, pero creo que eso no respeta el principio de encapsulación…
davy.ai
Respuesta:
Sí, es posible lograr el comportamiento deseado sin introducir nuevas clases o violar el principio de encapsulación. Un enfoque sería agregar una variable de contador estática a la clase Point que registre la cantidad de objetos Point instanciados sin nombre.
Aquí hay una versión actualizada de la clase Point que implementa esto:
En esta versión, la variable
unnamedCount
es estática, lo que significa que pertenece a la propia clase en lugar de a las instancias individuales de la clase. Cada vez que se llama al constructor sin argumentos, se incrementaunnamedCount
y se utiliza ese valor para construir un nombre para el nuevo objeto Point.Ten en cuenta que
unnamedCount
es privado y, por lo tanto, está encapsulado dentro de la clase Point. No se puede acceder o modificar desde ningún código fuera de la clase Point.Con esta implementación, puedes crear objetos Point en
testPoint.java
sin especificar un nombre, de la siguiente manera:El primer Point creado tendrá el nombre “AutoName1” y el segundo tendrá el nombre “AutoName2”. Si creas objetos Point sin nombre adicionales, se llamarán “AutoName3”, “AutoName4”, y así sucesivamente.