Инициализация нескольких переменных к одному значению в Java

214

Я ищу чистый и эффективный способ объявления нескольких переменных одного типа и одного и того же значения. Прямо сейчас у меня есть:

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

Но я ищу что-то вроде:

String one,two,three = ""

Это то, что можно сделать в Java? Помня об эффективности.

user83643
источник
5
Имейте в виду эффективность, что?
Хачик
15
Длина кода, время для ввода, визуально просто. Это то, что я имею в виду. Я знаю, что резервирование памяти - это сохранение памяти и что этот вопрос связан с «человеческой» стороной вещей.
user83643
1
Я бы сказал, что это в целом противоречит принятым соглашениям Java, это удивит читателя, и ИМХО труднее читать, чем объявлять их в отдельных строках.
Симеон
4
Я проверил производительность (на java 8) a = b = c = d = e = true занимает в 2 раза больше чем a = true; б = правда; и так далее.
Амит Кумар Гупта

Ответы:

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 = new Node (value). Поэтому и голова, и хвост должны указывать на одну и ту же ссылку.
bcorso
Это один и тот же объект? Если я потом делать one = "cat"будет two.equals("cat")возвращать правда?
Aequitas
Единственное предостережение в том, что это не будет работать для статических переменных.
Игорь Ганапольский
Как насчет целочисленных объявлений?
Игорь Ганапольский,
Почему это не работает с календарем? если вы сделаете так, то каждая переменная будет вести себя как одна и та же, когда вы манипулируете одной из них
TheCrazyProfоресурс
59

Вы можете объявить несколько переменных и инициализировать несколько переменных, но не обе одновременно:

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

Тем не менее, подобные вещи (особенно множественные назначения) будут осуждены большинством разработчиков Java, которые считают это противоположным «визуально простому».

Майкл Боргвардт
источник
24
+1 за то, что он указал, что то, что он пытается сделать , не является нормой.
Брайан Роуч
это для строки, но как для целых чисел ?? int день, месяц, год, час, мин = день = месяц = ​​год = час = 0; это правильно ??
Ранджит
23

Нет, это невозможно в Java.

Вы можете сделать это так .. Но постарайтесь избежать этого.

String one, two, three;
one = two = three = "";
sgokhales
источник
8
Можете ли вы объяснить, почему этого следует избегать?
Нейрон
@ Одинокий Нейрон Я думаю, что легко ошибиться, если использовать его таким образом.
Юйхан Лин
3
@YuhangLin Я просто надеялся на лучший ответ
Нейрон
@LonelyNeuron Ну, во-первых, это медленнее. Это занимает почти вдвое больше времени, как если бы вы просто инициализировали отдельно. Другим эта «особенность» не нужна. Я не могу придумать сценарий, который нельзя было бы решить с помощью другого подхода. Просто сказано не чистый код.
Александр Хейм
@AlexanderHeim Спасибо за объяснение. Но причина, по которой я спросил, заключалась в том, что это должно быть частью ответа.
Нейрон
18

Работает для примитивов и неизменных классов, таких как String, классы Wrapper Character, Byte.

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

Но все это будет указывать на один и тот же случай. Это не вызовет проблем с конечными переменными или примитивными типами. Таким образом, вы можете сделать все в одной строке.

HyperNeutrino
источник
2

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

Второй пример, который вы дали, будет только инициализировать последнюю переменную, равную «», а не остальные.

RMT
источник
0

Слишком поздно, но я нашел самый простой способ:

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

Вывод:

hello
hello
hello
starscream_disco_party
источник