Ініціалізація декількох змінних на одне значення в Java


214

Я шукаю чистий та ефективний метод декларування декількох змінних одного типу та одного значення. Зараз у мене є:

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

Але я шукаю щось на кшталт:

String one,two,three = ""

Це щось таке, що можна зробити в Java? Маючи на увазі ефективність.


5
Майте на увазі ефективність того, що?
хачик

15
Довжина коду, час набору, візуально простий. Це я маю на увазі. Я знаю, що резервування пам'яті - це резервування пам'яті, і це питання пов'язане з "людською" стороною речей.
користувач83643

1
Я б сказав, що це взагалі проти прийнятих конвенцій Java, це здивує читача, і IMHO важче прочитати, ніж декларувати їх окремими рядками.
Симеон

4
Я перевірив, чи є продуктивність (на java 8) a = b = c = d = e = true займає 2х + рази, ніж a = true; b = правда; і так далі.
Аміт Кумар Гупта

Відповіді:


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

Це повинно працювати з незмінними предметами. Наприклад, для змінних об'єктів немає сенсу:

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

Усі змінні вказували б на один і той же екземпляр. Напевно, що вам знадобиться у такому випадку:

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

Або ще краще використовувати масив або Collection.


11
Бувають випадки, коли це має сенс і для змінних об'єктів. Наприклад, у конструкторі реалізації пов'язаного списку, де спочатку: head = tail = новий Node (значення). Отже, і голова, і хвіст повинні вказувати на одне посилання.
bcorso

Це той самий об’єкт? Якщо я потім робити one = "cat"буде two.equals("cat")повертати правда?
Aequitas

Єдине застереження полягає в тому, що це не працює для статичних змінних.
ІгорГанапольський

Що з цілими деклараціями?
ІгорГанапольський

Чому це не працює з Календарем? якщо ви зробите це, що кожна змінна поводиться так, як її однаково, коли ви маніпулюєте однією з них
TheCrazyProfessor

59

Ви можете оголосити кілька змінних та ініціалізувати декілька змінних, але не обидві одночасно:

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

Однак подібні речі (особливо багаторазові завдання) нахмуряться більшістю розробників Java, які вважають це протилежно "візуально простим".


24
+1 за вказівку, що те, що він намагається зробити , не є нормою.
Брайан Роуч

це для String, але як для цілих чисел ?? int день, місяць, рік, година, хв = день = місяць = рік = година = 0; це право ??
Ранджіт

23

Ні, в Java це неможливо.

Можна зробити так .. Але намагайтеся цього уникати .

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

8
Чи можете ви пояснити, чому цього слід уникати?
Нейрон

@Lonely Neuron Я думаю, що легко помилитися, якщо використовувати її таким чином.
Юханг Лін

3
@YuhangLin я просто сподівався на кращу відповідь
Нейрон

@LonelyNeuron Ну для одного це повільніше. Це займає майже вдвічі більше часу, як якщо б ви просто ініціалізувались окремо. Один з інших ця "особливість" непотрібна. Я не можу придумати сценарій, який би не вирішився, використовуючи інший підхід. Це просто сказано, що не чистий код.
Олександр Гейм

@AlexanderHeim Дякую за пояснення. Але я попросив, що це було частиною відповіді.
Нейрон

18

Працює для примітивних та непорушних класів, таких як String, Класс Wrapper, Характер, Байт.

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

Для змінних занять

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

Три посилання + один об’єкт створено. Всі посилання вказують на один і той же об’єкт, і ваша програма буде погано поводитися.


2
Я не погоджуюся з "Усі посилання, що вказують на один і той же об'єкт, і ваша програма погано поводиться". Єдина проблема полягає в тому, що те, що відбувається з об'єктом однієї посилання, відбувається з об'єктом іншої посилання - тому що це той самий об’єкт. Це не поведінка; це як працює Java.
GKFX

що ви маєте на увазі під "недоброзичливцем"? Він поводитиметься інакше, ніж 3 окремо ініціалізовані об'єкти, але це дійсно залежить від того, що ви хочете ..
Нейрон

12

Ви можете зробити це:

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

Але все це вказуватиме на один і той же екземпляр. Це не спричинить проблем з кінцевими змінними або примітивними типами. Таким чином, ви можете зробити все в один рядок.


2

Я не думаю, що це можливо, вам доведеться встановлювати всі значення індивідуально (як перший приклад, який ви надали.)

Другий приклад, який ви навели, буде ініціалізувати лише останню змінну до "", а не інші.


0

Шлях занадто пізно до цього, але найпростіший спосіб, який я знайшов, це:

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

Вихід:

hello
hello
hello
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.