在Java中将多个变量初始化为相同的值


214

我正在寻找一种声明相同类型和相同值的多个变量的干净有效的方法。现在我有:

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

但是我正在寻找类似的东西:

String one,two,three = ""

这是可以在Java中完成的事情吗?牢记效率。


5
牢记效率的效率是什么?
卡其奇2011年

15
代码长度,键入时间,外观简单。那就是我的意思。我知道保留内存就是保留内存,这个问题与事物的“人性化”方面有关。
user83643 2011年

1
我想说这通常是违反公认的Java约定的,这会让读者感到惊讶,并且IMHO比在单独的行中声明它们更难阅读。
Simeon

4
我检查了性能(在Java 8上)a = b = c = d = e = true比a = true需要2倍以上的时间;b =真; 等等。
阿米特·库玛·古普塔

Answers:


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")返回true?
Aequitas

唯一的警告是,这不适用于静态变量。
IgorGanapolsky

整数声明呢?
IgorGanapolsky'9

为什么这不适用于日历?如果您这样做,则每个变量在操作其中一个变量时的行为都相同
TheCrazyProfessor

59

您可以声明多个变量,并初始化多个变量,但不能同时初始化两个变量:

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

但是,大多数Java开发人员都会反对这种事情(尤其是多重分配),他们会认为这 “外观简单” 相反


24
+1指出他想做的事不是常态。
Brian Roach

这是为字符串,但如何为整数?int日,月,年,小时,分钟=日=月=年=小时= 0; 这样对吗 ??
Ranjit

23

不,在Java中是不可能的。

您可以通过这种方式进行..但是要避免这种情况。

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

8
您能解释为什么应该避免这种情况吗?
Neuron

@Lonely Neuron我认为如果以这种方式使用它很容易出错。
Yuhang Lin

3
@YuhangLin我只是希望有一个更好的答案
Neuron

@LonelyNeuron好吧,它慢一点。几乎要花两次时间,就好像您要单独初始化一样。一个“另一个”是不必要的。我想不出使用其他方法无法解决的情况。只是说这不是干净的代码。
亚历山大·海姆

@AlexanderHeim感谢您的解释。但是我问的原因是因为它应该是答案的一部分。
Neuron

18

适用于原语和不可变类,如String包装类字符字节。

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

对于可变类

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

创建了三个引用+一个对象。所有引用都指向同一对象,并且您的程序将无法正常运行。


2
我不同意“所有指向同一对象的引用,您的程序都会出现异常。” 唯一的问题是,一个引用的对象发生的事情也发生在另一个引用的对象上-因为它是同一对象。这不是行为不端;这就是Java的工作方式。
GKFX

“不当行为”是什么意思?与3个单独初始化的对象相比,它的行为将有所不同,但这实际上取决于您想要的
Neuron

12

你可以这样做:

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

但是这些都指向同一实例。它不会导致最终变量或原始类型出现问题。这样,您可以在一行中完成所有操作。


2

我认为您不必设置所有值都是唯一的(就像您提供的第一个示例一样)。

您提供的第二个示例将仅将最后一个变量初始化为“”,而不初始化其他变量。


0

为此,为时已晚,但我发现的最简单方法是:

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

输出:

hello
hello
hello
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.