Initialisation de plusieurs variables à la même valeur en Java

214

Je recherche une méthode propre et efficace pour déclarer plusieurs variables du même type et de la même valeur. En ce moment, j'ai:

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

Mais je cherche quelque chose comme:

String one,two,three = ""

Est-ce quelque chose qu'il est possible de faire en java? Garder l'efficacité à l'esprit.

user83643
la source
5
Gardez l'efficacité à l'esprit l' efficacité de quoi?
khachik
15
Longueur du code, temps pour taper, visuellement simple. C'est ce que je veux dire. Je sais que réserver de la mémoire, c'est réserver de la mémoire et que cette question est liée au côté «humain» des choses.
user83643
1
Je dirais que cela est généralement contraire aux conventions Java acceptées, cela surprendra le lecteur et à mon humble avis est plus difficile à lire que de les déclarer sur des lignes distinctes.
Simeon
4
J'ai vérifié les performances (sur java 8) a = b = c = d = e = true prend 2x + fois que a = true; b = vrai; etc.
Amit Kumar Gupta

Réponses:

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

Cela devrait fonctionner avec des objets immuables. Cela n'a aucun sens pour les objets mutables par exemple:

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

Toutes les variables pointeraient vers la même instance. Ce dont vous auriez probablement besoin dans ce cas est:

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

Ou mieux encore, utilisez un tableau ou un Collection.

Alfredo Osorio
la source
11
Il y a des cas où cela a également du sens pour les objets mutables. Par exemple, dans le constructeur de l'implémentation de liste liée où initialement: head = tail = new Node (value). La tête et la queue doivent donc pointer vers la même référence.
bcorso
S'agit-il du même objet? Si je fais plus tard one = "cat"sera two.equals("cat")retourne vrai?
Aequitas
La seule mise en garde est que cela ne fonctionnerait pas pour les variables statiques.
IgorGanapolsky
Qu'en est-il des déclarations entières?
IgorGanapolsky
Pourquoi cela ne fonctionne-t-il pas avec Calendar? si vous faites cela, chaque variable se comporte de la même manière lorsque vous manipulez l'une d'entre elles
TheCrazyProfessor
59

Vous pouvez déclarer plusieurs variables et initialiser plusieurs variables, mais pas les deux en même temps:

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

Cependant, ce genre de chose (en particulier les affectations multiples) serait mal vu par la plupart des développeurs Java, qui le considéreraient comme l' opposé de "visuellement simple".

Michael Borgwardt
la source
24
+1 pour avoir souligné que ce qu'il essaie de faire n'est pas la norme.
Brian Roach
c'est pour String, mais comment pour les entiers ?? int jour, mois, année, heure, min = jour = mois = année = heure = 0; est ce juste ??
Ranjit
23

Non, ce n'est pas possible en java.

Vous pouvez le faire de cette façon .. Mais essayez de l'éviter .

String one, two, three;
one = two = three = "";
sgokhales
la source
8
Pouvez-vous expliquer pourquoi cela devrait être évité?
Neuron
@Lonely Neuron Je pense qu'il est facile de se tromper si vous l'utilisez de cette façon.
Yuhang Lin
3
@YuhangLin J'espérais juste une meilleure réponse
Neuron
@LonelyNeuron Eh bien pour celui-ci, c'est plus lent. Cela prend presque deux fois plus de temps que si vous souhaitiez simplement l'initialiser séparément. L'un l'autre, cette "fonctionnalité" est inutile. Je ne peux pas penser à un scénario qui ne serait pas résoluble en utilisant une approche différente. C'est simplement dit que ce n'est pas un code propre.
Alexander Heim
@AlexanderHeim Merci pour l'explication. Mais la raison pour laquelle j'ai demandé, c'est parce que cela devrait faire partie de la réponse.
Neuron
18

Fonctionne pour les classes primitives et immuables telles que les Stringclasses Wrapper Character, Byte.

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

Pour les classes mutables

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

Trois références + un objet sont créés. Toutes les références pointent vers le même objet et votre programme se comportera mal.

Srujan Kumar Gulla
la source
2
Je ne suis pas d'accord avec "Toutes les références pointant vers le même objet et votre programme se comportera mal". Le seul problème est que ce qui arrive à l'objet d'une référence arrive à l'objet d'une autre référence - parce que c'est le même objet. Ce n'est pas une mauvaise conduite; c'est comme ça que Java fonctionne.
GKFX
que voulez-vous dire par "mauvaise conduite"? Il se comportera différemment de 3 objets initialisés séparément, mais cela dépend vraiment de ce que vous voulez ..
Neuron
12

Tu peux le faire:

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

Mais ceux-ci pointeront tous vers la même instance. Cela ne causera pas de problèmes avec les variables finales ou les types primitifs. De cette façon, vous pouvez tout faire en une seule ligne.

HyperNeutrino
la source
2

Je ne pense pas que ce soit possible, vous devez définir toutes les valeurs individuellement (comme le premier exemple que vous avez fourni.)

Le deuxième exemple que vous avez donné n'initialisera que la dernière variable à "" et pas les autres.

RMT
la source
0

Trop tard, mais la façon la plus simple que j'ai trouvée est:

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

Production:

hello
hello
hello
starscream_disco_party
la source