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.


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.


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”.


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 = "";

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ł.


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.