Inicializando várias variáveis ​​com o mesmo valor em Java

214

Estou procurando um método limpo e eficiente de declarar várias variáveis ​​do mesmo tipo e do mesmo valor. Agora eu tenho:

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

Mas estou procurando algo como:

String one,two,three = ""

Isso é algo que é possível fazer em java? Mantendo a eficiência em mente.

user83643
fonte
5
Mantenha a eficiência em mente a eficiência de quê?
khachik
15
Comprimento do código, hora de digitar, visualmente simples. É o que eu quero dizer. Eu sei que reservar memória está reservando memória e que esta questão está relacionada ao lado "humano" das coisas.
user83643
1
Eu diria que isso geralmente é contra as convenções Java aceitas, surpreenderá o leitor e o IMHO é mais difícil de ler do que declará-las em linhas separadas.
Simeon
4
Eu verifiquei o desempenho (em java 8) a = b = c = d = e = true leva 2x + vezes que a = true; b = verdadeiro; e assim por diante.
Amit Kumar Gupta

Respostas:

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

Isso deve funcionar com objetos imutáveis. Não faz sentido para objetos mutáveis, por exemplo:

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

Todas as variáveis ​​apontariam para a mesma instância. Provavelmente o que você precisaria nesse caso é:

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

Ou melhor ainda, use uma matriz ou a Collection.

Alfredo Osorio
fonte
11
Há casos em que isso também faz sentido para objetos mutáveis. Por exemplo, no construtor da implementação de lista vinculada, onde inicialmente: head = tail = new Node (value). Portanto, cabeça e cauda devem apontar para a mesma referência.
bcorso
Estes são o mesmo objeto? Se eu mais tarde fazer one = "cat"vai two.equals("cat")retornar true?
Aequitas
A única ressalva é que isso não funcionaria para variáveis ​​estáticas.
IgorGanapolsky
E as declarações de número inteiro?
IgorGanapolsky
Por que isso não funciona com o Google Agenda? se você fizer isso cada comportam variável como é o mesmo quando você manipula um deles
TheCrazyProfessor
59

Você pode declarar várias variáveis ​​e inicializar várias variáveis, mas não as duas ao mesmo tempo:

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

No entanto, esse tipo de coisa (especialmente as várias atribuições) seria desaprovado pela maioria dos desenvolvedores de Java, que considerariam o oposto de "visualmente simples".

Michael Borgwardt
fonte
24
+1 por apontar que o que ele está tentando fazer não é a norma.
Brian Roach
isso é para String, mas como para inteiros ?? int dia, mês, ano, hora, min = dia = mês = ano = hora = 0; está certo ??
Ranjit
23

Não, não é possível em java.

Você pode fazer desta maneira .. Mas tente evitá- lo.

String one, two, three;
one = two = three = "";
sgokhales
fonte
8
Você pode explicar por que isso deve ser evitado?
28518 Neuron
@Lonely Neuron Acho que é fácil cometer um erro se você usá-lo dessa maneira.
Yuhang Lin
3
@YuhangLin eu só estava esperando por uma resposta melhor
Neuron
@LonelyNeuron Bem, para um, é mais lento. Leva quase o dobro do tempo, como se você fosse inicializar separadamente. Um pelo outro, esse "recurso" é desnecessário. Não consigo pensar em um cenário que não seria solucionável usando uma abordagem diferente. É simplesmente dito que não é um código limpo.
Alexander Heim
@AlexanderHeim Obrigado pela explicação. Mas o motivo pelo qual perguntei foi porque deveria fazer parte da resposta.
21419 Neuron
18

Trabalha para classes primitivas e imutáveis ​​como String, classes Wrapper Character, Byte.

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

Para classes mutáveis

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

Três referências + um objeto são criadas. Todas as referências apontam para o mesmo objeto e seu programa se comportará mal.

Srujan Kumar Gulla
fonte
2
Não concordo com "Todas as referências apontando para o mesmo objeto e seu programa se comportará mal". O único problema é que o que acontece com o objeto de uma referência acontece com o objeto de outra referência - porque é o mesmo objeto. Isso não é mau comportamento; é como o Java funciona.
GKFX
o que você quer dizer com "comportar-se mal"? Ele irá se comportar de forma diferente, em seguida, 3 objetos inicializados separadamente, mas realmente depende do que você quer ..
Neuron
12

Você consegue fazer isso:

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

Mas tudo isso apontará para a mesma instância. Não causará problemas com variáveis ​​finais ou tipos primitivos. Dessa forma, você pode fazer tudo em uma linha.

HyperNeutrino
fonte
2

Não acho que seja possível que você tenha que definir todos os valores individualmente (como no primeiro exemplo que você forneceu).

O segundo exemplo que você deu apenas inicializará a última variável para "" e não as outras.

RMT
fonte
0

Tarde demais para isso, mas a maneira mais simples que encontrei é:

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

Resultado:

hello
hello
hello
starscream_disco_party
fonte