es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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…

Tags:  , , ,

Answer

  1. Avatar for 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:

    public class Point {
        private String name;
        private static int unnamedCount = 0;
    
        public Point() {
            this("AutoName" + ++unnamedCount);
        }
    
        public Point(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    

    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 incrementa unnamedCount 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:

    Point p1 = new Point();
    Point p2 = new Point();
    

    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.

Comments are closed.