¿Cómo definir un nombre de objeto java con una variable?

2023-01-25 04:16:49

Necesito crear una gran cantidad de objetos usando un patrón de nombres fácilmente obtenible a través de un bucle. ¿Hay alguna forma de que el nombre de un objeto se lea desde una variable, como esta?

String Var = "ObjectName";
ClassName Var = new ClassName();

No necesito que al objeto se le asigne un nombre de variable, simplemente para obtener el nombre en el momento de la asignación.

- The Mather1

Source
zh
Responder


4
  • Tu elección de palabras muestra que no comprendes completamente la forma en que funcionan las variables y los objetos, y necesitas corregir eso para llegar a alguna parte con Java.

    Si escribo:

    Item myItem = new Item();
    

    Creo un nuevo objeto, y defino una variable que apunta a ese objeto.

    El objeto no tiene nombre (tiene una ID, que es un número asignado en tiempo de ejecución; la mayoría de los programadores pueden ignorarlo).

    La variable tiene un nombre, myItem. La variable apunta al objeto. Más tarde, podría apuntar a un objeto diferente. La variable podría quedar fuera del alcance y dejar de existir, mientras que el objeto sigue existiendo.

    Podrías decir, "eso no es importante. Si digo el 'nombre del objeto', quiero decir 'el nombre de la variable que apunta al objeto'".

    Pero es importante, porque muchos objetos serán señalados por más de una variable:

    Item myItem = new Item();
    Item yourItem = myItem;
    // both variables point to the same object. Neither variable is "more" the
    // owner of the object than the other.
    

    ... y muchos objetos no serán señalados directamente por una variable.

    myList.append(new Item()); 
    // you can't get at this new object using a direct variable.
    

    En Java (y en la mayoría de los lenguajes principales), no puede crear nombres de variables en tiempo de ejecución. Los únicos nombres de variables que existen son los que están literalmente en el código fuente.

    Entonces no hay nada que funcione así:

    int number = 1;
    Cell cell$number = new Cell(); // can't be done!
    Cell currentCell = cell1; 
    

    Tampoco puede acceder a las variables por su nombre, en función de los datos de tiempo de ejecución. Así que no hay nada que funcione así:

    Cell cell1 = ...;
    int number = 1;
    Cell currentCell = cell$number; // can't be done!
    

    Esto es bueno porque permite que el compilador valide ciertas cosas sobre su código.

    En algunos idiomas, es posible que puedas lograr algo como esto usando eval(), ¡pero deberías correr un kilómetro y medio!

    Esta es una pista de que si está escribiendo código como:

     Cell cell0 = new Cell(...);
     Cell cell1 = new Cell(...);
     ...
     Cell cell99 = new Cell(...);
    

    ... entonces estás haciendo algo mal. Puede funcionar, pero escala mal. No hay manera de poner esto en un bucle. (No se preocupe, la mayoría de nosotros nos encontramos con este problema cuando comenzamos a programar).

    Si, en cambio, hubieras usado una matriz:

     Cell[] cells = new Cell[];
     cells[0] = new Cell(...);
     cells[1] = new Cell(...);
     ...
     cells[99] = new Cell(...);
    

    Entonces podrías usar un bucle en su lugar:

     for(int i = 0; i<100; i++) {
         cells[i] = new Cell(...);
     } 
    

    Una matriz es el más simple de los objetos de "colección". También hay Conjuntos, Listas, Mapas y una gran cantidad de colecciones más avanzadas para satisfacer la mayoría de las necesidades.

    Parece que desea almacenar y acceder a objetos utilizando cadenas como clave. La forma de hacerlo es usando un Mapa.

    Map<String,Cell> myMap = new TreeMap<String,Cell>();
    
    myMap.put("AA", new Cell(...));
    myMap.put("AB", new Cell(...));
    
    ...
    
    Cell currentCell = myMap.get("AA");
    

    Map es una interfaz. TreeMap es solo una clase que proporciona una implementación de la interfaz Map. Infórmese sobre las diversas implementaciones de Map proporcionadas por el JRE estándar.

    La clave no tiene que ser String. Cualquier cosa que implemente equals() puede usarse como clave.

    Usando esto:

    for(char c = 'A'; c <= 'L'; c++) {
       for(char d = 'A'; d<= 'L'; d++) {
           myMap.put("" + c + d, new Cell(...));
       }
    }
    

    Sin embargo, dado que dijo que desea una cuadrícula, probablemente sea mejor trabajar con una matriz 2D y traducir las coordenadas numéricas hacia y desde una referencia de cuadrícula con letras siempre que lo necesite. Busque en Google "matriz 2D Java" y encontrará muchos ejemplos.

    Cell[][] cells = new Cell[12][12];
    for(int x=0; x<12; x++) {
       for(int y=0; y<12; y++) {
           Cell cell = new Cell();
           cell.setName( "" + ('A' + x) + ('A' + y)); // perhaps
           cells[x][y] = cell;
       }
    }
    

    Más allá del JRE estándar, hay muchas otras implementaciones de Map. Por ejemplo, Spring proporciona DefaultRedisMap, en el que los objetos se almacenan en una base de datos de Redis.

    En términos más generales, ha hecho una pregunta muy básica aquí. Debería leer el capítulo sobre la API de colecciones en cualquier libro Java decente.