Inicjowanie wielu zmiennych do tej samej wartości w Javie

214

Szukam czystej i wydajnej metody deklarowania wielu zmiennych tego samego typu i tej samej wartości. W tej chwili mam:

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

Ale szukam czegoś takiego:

String one,two,three = ""

Czy to jest coś, co można zrobić w Javie? Pamiętając o wydajności.

użytkownik83643
źródło
5
Wydajność należy pamiętać o wydajności?
khachik
15
Długość kodu, czas na wpisanie, wizualnie prosty. To miałem na myśli. Wiem, że rezerwowanie pamięci jest rezerwowaniem pamięci i że to pytanie wiąże się z „ludzką” stroną rzeczy.
user83643,
1
Powiedziałbym, że jest to generalnie sprzeczne z przyjętymi konwencjami Java, zaskoczy czytelnika, a IMHO jest trudniejszy do odczytania niż zadeklarowanie ich w osobnych wierszach.
Simeon
4
Sprawdziłem wydajność (na java 8) a = b = c = d = e = prawda zajmuje 2x + razy niż a = prawda; b = prawda; i tak dalej.
Amit Kumar Gupta,

Odpowiedzi:

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

Powinno to działać z niezmiennymi obiektami. Nie ma to sensu w przypadku obiektów zmiennych, na przykład:

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

Wszystkie zmienne wskazywałyby na to samo wystąpienie. Prawdopodobnie w takim przypadku potrzebujesz:

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

Lub jeszcze lepiej użyj tablicy lub Collection.

Alfredo Osorio
źródło
11
Są przypadki, w których ma to sens również w przypadku obiektów zmiennych. Na przykład w konstruktorze implementacji Linkedlist, gdzie początkowo: head = tail = new Node (value). Zatem zarówno głowa, jak i ogon powinny wskazywać to samo odniesienie.
bcorso,
Czy to ten sam obiekt? Jeśli później to one = "cat"zrobię, czy to two.equals("cat")prawda?
Aequitas
Jedynym zastrzeżeniem jest to, że nie działałoby to dla zmiennych statycznych.
IgorGanapolsky
Co z deklaracjami liczb całkowitych?
IgorGanapolsky
Dlaczego to nie działa z Kalendarzem? jeśli to zrobisz, każda zmienna zachowuje się tak samo, gdy manipulujesz jedną z nich
TheCrazyProfessor
59

Możesz zadeklarować wiele zmiennych i zainicjować wiele zmiennych, ale nie oba jednocześnie:

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

Jednak tego rodzaju rzeczy (zwłaszcza wielokrotne przypisania) byłyby niezadowolone przez większość programistów Java, którzy uważaliby to za przeciwieństwo „wizualnie prostego”.

Michael Borgwardt
źródło
24
+1 za wskazanie, że to, co próbuje zrobić, nie jest normą.
Brian Roach
to jest dla String, ale jak dla liczb całkowitych? int dzień, miesiąc, rok, godzina, min = dzień = miesiąc = rok = godzina = 0; czy to jest poprawne ??
Ranjit
23

Nie, w Javie nie jest to możliwe.

Możesz to zrobić .. Ale staraj się tego unikać .

String one, two, three;
one = two = three = "";
sgokhales
źródło
8
Czy możesz wyjaśnić, dlaczego należy tego unikać?
Neuron
@Lonely Neuron Myślę, że łatwo jest popełnić błąd, jeśli używasz go w ten sposób.
Yuhang Lin,
3
@YuhangLin Miałem tylko nadzieję na lepszą odpowiedź
Neuron
@LonelyNeuron Cóż, dla jednego jest wolniejszy. Zajmuje to prawie dwa razy więcej czasu, jakbyś tylko zainicjował osobno. Ta druga funkcja jest zbędna. Nie mogę wymyślić scenariusza, który nie dałby się rozwiązać, stosując inne podejście. To po prostu powiedziane, że nie jest to czysty kod.
Alexander Heim
@AlexanderHeim Dzięki za wyjaśnienie. Ale powodem, dla którego zapytałem, było to, że powinna być częścią odpowiedzi.
Neuron
18

Działa dla prymitywów i klas niezmiennych, takich jak String, klasy Wrapper Character, Byte.

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

Dla klas zmiennych

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

Tworzone są trzy referencje + jeden obiekt. Wszystkie odniesienia wskazują na ten sam obiekt, a Twój program będzie źle się zachowywał.

Srujan Kumar Gulla
źródło
2
Nie zgadzam się z „Wszystkie odwołania do tego samego obiektu, a Twój program źle się zachowa”. Jedyny problem polega na tym, że to, co dzieje się z obiektem jednego odniesienia, dzieje się z obiektem innego odniesienia - ponieważ jest to ten sam obiekt. To nie jest złe zachowanie; tak działa Java.
GKFX
co masz na myśli mówiąc „złe zachowanie”? Będzie się zachowywał inaczej niż 3 osobno zainicjowane obiekty, ale tak naprawdę zależy od tego, czego chcesz ..
Neuron
12

Możesz to zrobić:

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

Ale wszystkie będą wskazywać na tę samą instancję. Nie spowoduje problemów z końcowymi zmiennymi lub typami pierwotnymi. W ten sposób możesz zrobić wszystko w jednym wierszu.

HyperNeutrino
źródło
2

Nie sądzę, że jest to możliwe, musisz ustawić wszystkie wartości indywidualnie (tak jak w pierwszym podanym przykładzie).

Drugi przykład, który podałeś, zainicjuje tylko ostatnią zmienną do „”, a nie pozostałe.

RMT
źródło
0

Zbyt późno na to, ale najprostszym sposobem, jaki znalazłem, jest:

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

Wynik:

hello
hello
hello
starscream_disco_party
źródło