Inicializando múltiples variables al mismo valor en Java

214

Estoy buscando un método limpio y eficiente para declarar múltiples variables del mismo tipo y del mismo valor. En este momento tengo:

String one = "", two = "", three = "" etc...

Pero estoy buscando algo como:

String one,two,three = ""

¿Es esto algo que es posible hacer en Java? Teniendo en cuenta la eficiencia.

usuario83643
fuente
55
Tenga en cuenta la eficiencia eficiencia de qué?
khachik 01 de
15
Longitud del código, tiempo para escribir, visualmente simple. Eso es lo que quiero decir. Sé que reservar memoria es reservar memoria y que esta pregunta está relacionada con el lado "humano" de las cosas.
user83643
1
Diría que esto generalmente va en contra de las convenciones aceptadas de Java, sorprenderá al lector y en mi humilde opinión es más difícil de leer que declararlas en líneas separadas.
Simeon
44
Verifiqué el rendimiento (en java 8) a = b = c = d = e = verdadero toma 2 veces más que a = verdadero; b = verdadero; y así.
Amit Kumar Gupta

Respuestas:

319
String one, two, three;
one = two = three = "";

Esto debería funcionar con objetos inmutables. No tiene ningún sentido para objetos mutables, por ejemplo:

Person firstPerson, secondPerson, thirdPerson;
firstPerson = secondPerson = thirdPerson = new Person();

Todas las variables estarían apuntando a la misma instancia. Probablemente lo que necesitarías en ese caso es:

Person firstPerson = new Person();
Person secondPerson = new Person();
Person thirdPerson = new Person();

O mejor aún, use una matriz o un Collection.

Alfredo Osorio
fuente
11
Hay casos en los que esto también tiene sentido para objetos mutables. Por ejemplo, en el constructor de la implementación de la lista vinculada donde inicialmente: head = tail = new Node (value). Entonces, tanto la cabeza como la cola deben apuntar a la misma referencia.
bcorso
¿Son estos el mismo objeto? Si luego lo hago, one = "cat"¿ two.equals("cat")volveré verdadero?
Aequitas
La única advertencia es que esto no funcionaría para variables estáticas.
IgorGanapolsky
¿Qué pasa con las declaraciones de enteros?
IgorGanapolsky
¿Por qué esto no funciona con Calendar? si haces que cada variable se comporte igual cuando manipulas una de ellas
TheCrazyProfessor
59

Puede declarar múltiples variables e inicializar múltiples variables, pero no ambas al mismo tiempo:

 String one,two,three;
 one = two = three = "";

Sin embargo, este tipo de cosas (especialmente las asignaciones múltiples) sería mal visto por la mayoría de los desarrolladores de Java, que considerarían lo contrario de "visualmente simple".

Michael Borgwardt
fuente
24
+1 por señalar que lo que está tratando de hacer no es la norma.
Brian Roach
esto es para String, pero ¿cómo para enteros? int día, mes, año, hora, min = día = mes = año = hora = 0; Es correcto ??
Ranjit
23

No, no es posible en Java.

Puedes hacerlo de esta manera ... Pero trata de evitarlo .

String one, two, three;
one = two = three = "";
Sgokhales
fuente
8
¿Puedes explicar por qué esto debería evitarse?
Neurona
@Loneely Neuron Creo que es fácil cometer un error si lo usa de esta manera.
Yuhang Lin
3
@YuhangLin solo esperaba una mejor respuesta
Neuron
@LonelyNeuron Bueno, para uno es más lento. Tarda casi el doble de tiempo como si simplemente se inicializara por separado. Uno al otro esta "característica" es innecesaria. No puedo pensar en un escenario que no pueda resolverse utilizando un enfoque diferente. Simplemente se dice que no es un código limpio.
Alexander Heim
@AlexanderHeim Gracias por la explicación. Pero la razón por la que pregunté fue porque debería ser parte de la respuesta.
Neurona
18

Funciona para clases primitivas e inmutables como String, clases de envoltura de caracteres, bytes.

int i=0,j=2   
String s1,s2  
s1 = s2 = "java rocks"

Para clases mutables.

Reference r1 = Reference r2 = Reference r3 = new Object();`  

Se crean tres referencias + un objeto. Todas las referencias apuntan al mismo objeto y su programa se comportará mal.

Srujan Kumar Gulla
fuente
2
No estoy de acuerdo con "Todas las referencias apuntan al mismo objeto y su programa se comportará mal". El único problema es que lo que le sucede al objeto de una referencia le sucede al objeto de otra referencia, porque es el mismo objeto. Esto no es mal comportamiento; así es como funciona Java.
GKFX
¿Qué quieres decir con "portarse mal"? Se comportará de manera diferente que 3 objetos inicializados por separado, pero realmente depende de lo que quieras ...
Neuron
12

Puedes hacerlo:

String one, two, three = two = one = "";

Pero todos apuntarán a la misma instancia. No causará problemas con variables finales o tipos primitivos. De esta manera, puedes hacer todo en una línea.

Hiperneutrino
fuente
2

No creo que sea posible que tenga que establecer todos los valores individualmente (como el primer ejemplo que proporcionó).

El Segundo ejemplo que usted dio, solo Inicializará el último variable para "" y no los otros.

RMT
fuente
0

Demasiado tarde para esto, pero la forma más simple que he encontrado es:

String foo = bar = baz = "hello"
println(foo)
println(bar)
println(baz)

Salida:

hello
hello
hello
starscream_disco_party
fuente