Asignar variables con nombres dinámicos en Java

96

Me gustaría asignar un conjunto de variables en Java de la siguiente manera:

int n1,n2,n3;

for(int i=1;i<4;i++)
{
    n<i> = 5;
}

¿Cómo puedo lograr esto en Java?

Ashish Anand
fuente
1
¿Podría aclarar su pregunta?
Ing
4
¿Necesita hacer esto para las variables locales? ¿Por qué no elementos de matriz?
Ray Toal
@ Eng.Fouad: Quiero acceder a las variables por su nombre de forma dinámica.
Ashish Anand
@Ashish Anand ¿te
refieres a

Respuestas:

111

No es así como se hacen las cosas en Java. No hay variables dinámicas en Java. Las variables de Java deben declararse en el código fuente 1 .

Dependiendo de lo que esté tratando de lograr, debe usar una matriz, a Listo a Map; p.ej

int n[] = new int[3];
for (int i = 0; i < 3; i++) {
    n[i] = 5;
}

List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
    n.add(5);
}

Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
    n.put("n" + i, 5);
}

Es posible utilizar la reflexión para hacer referencia de forma dinámica a las variables que se han declarado en el código fuente. Sin embargo, esto solo funciona para variables que son miembros de la clase (es decir, campos estáticos y de instancia). No funciona para variables locales. Vea el ejemplo "rápido y sucio" de @ fyr.

Sin embargo, hacer este tipo de cosas innecesariamente en Java es una mala idea. Es ineficiente, el código es más complicado y, dado que depende de la verificación del tiempo de ejecución, es más frágil. Y esto no es "variables con nombres dinámicos". Se describe mejor como acceso dinámico a variables con nombres estáticos.


1 - Esa afirmación es ligeramente inexacta. Si usa BCEL o ASM, puede "declarar" las variables en el archivo de código de bytes. ¡Pero no lo hagas! ¡De esa manera yace la locura!

Stephen C
fuente
1
Muchas gracias, obtuve lo que estaba buscando. La última parte (Map <String, integer>).
Ashish Anand
1
Cabe señalar que incluso si fuera posible, no debería ser algo que realmente harías. No ganas nada con eso; realmente perderá legibilidad. Si desea vincularlos, use a Map<String, T>en su lugar, no comience a jugar con su código real.
Jeroen Vannevel
2
@JeroenVannevel - Eso es lo que quise decir con "locura" :-)
Stephen C
35

Si desea acceder a las variables con algún tipo de dinámica, puede usar la reflexión. Sin embargo, Reflection no funciona para variables locales. Solo se aplica a los atributos de clase.

Un ejemplo rápido y sucio es este:

public class T {
    public Integer n1;
    public Integer n2;
    public Integer n3;

    public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
            NoSuchFieldException {

        for (int i = 1; i < 4; i++) {
            T.class.getField("n" + i).set(this, 5);
        }
    }
}

Necesita mejorar este código de varias maneras, es solo un ejemplo. Esto tampoco se considera un buen código.

fyr
fuente
3
Excelente cuando necesita convertir el sensor event.values ​​[] de Android en un conjunto de variables. event.values ​​[] podría tener una longitud de 1 a 6 y es útil convertirlo, en mi caso para una clasificación json sin arreglo.
Farshid T
12

Lo que necesitas se llama matriz. Quería escribir el siguiente código:

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}
AlexR
fuente
1
No quiero usar matrices. Quiero acceder dinámicamente a las variables (n1, n2, n3) dependiendo de alguna condición.
Ashish Anand
10

Deberías usar Listo en su arraylugar

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

O

int[] arr  = new int[10];
arr[0]=1;
arr[1]=2;

O mejor

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);

//conditionally get 
map.get("n1");
Jigar Joshi
fuente
7

Nombres de variables dinámicas en Java
No existe tal cosa.

En su caso, puede usar array:

int[] n = new int[3];
for() {
 n[i] = 5;
}

Para (name, value)pares más generales , useMap<>

Op De Cirkel
fuente
4

Prueba de esta manera:

    HashMap<String, Integer> hashMap = new HashMap();

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }

fuente
4

Tu no Lo más parecido que puede hacer es trabajar con Mapas para simularlo o definir sus propios Objetos con los que lidiar.

everton
fuente