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


214

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

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

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

String one,two,three = ""

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


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

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

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


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.