Javaで複数の変数を同じ値に初期化する


214

同じ型で同じ値の複数の変数を宣言する、クリーンで効率的な方法を探しています。今私は持っています:

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

しかし、私は次のようなものを探しています:

String one,two,three = ""

これはJavaで実行可能なものですか?効率を念頭に置いてください。


5
効率は何の効率に留意しますか?
khachik

15
コードの長さ、入力する時間、視覚的にシンプル。それが私の言いたいことです。記憶を予約することは記憶を予約することであり、この質問は物事の「人間」の側面に関連していることを知っています。
user83643

1
これは一般に受け入れられているJavaの規則に反していると思います。読者を驚かせ、IMHOはそれらを別々の行で宣言するよりも読みにくいです。
Simeon

4
(Java 8で)パフォーマンスを確認しました。a= b = c = d = e = trueは、a = trueの2倍以上かかります。b = 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
これは、変更可能なオブジェクトでも同様に有効な場合があります。たとえば、最初に次のリンクリスト実装のコンストラクターで:ヘッド=テール=新しいノード(値)。したがって、頭と尾の両方が同じ参照を指す必要があります。
bcorso 2013年

これらは同じオブジェクトですか?後でtrue one = "cat"two.equals("cat")返す場合はどうなりますか?
Aequitas 2015

唯一の注意点は、これが静的変数に対して機能しないことです。
IgorGanapolsky 2015年

整数宣言はどうですか?
IgorGanapolsky 2017

これがカレンダーで機能しないのはなぜですか?その場合、いずれかの変数を操作すると、すべての変数は同じように動作します
TheCrazyProfessor

59

複数の変数を宣言し、複数の変数を初期化できますが、同時に両方はできません。

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

ただし、このようなこと(特に複数の割り当て)は、「視覚的に単純な」ものの反対であると考えるほとんどのJava開発者によって嫌われます。


24
彼がやろうとしているの標準ではないことを指摘するための+1 。
ブライアンローチ

これは文字列用ですが、整数はどうですか?int日、月、年、時、分=日=月=年=時間= 0; 正しいですか?
Ranjit 2013年

23

いいえ、Javaではできません。

あなたはこの方法を行うことができます..しかし、回避しようと、それを。

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

8
これを避けるべき理由を説明できますか?
Neuron

@Lonely Neuronこのように使うと間違いやすいのではないかと思います。
Yuhang Lin

3
@YuhangLin私はより良い答えを期待していた
Neuron

@LonelyNeuronまあ、それは遅いです。個別に初期化する場合の2倍の時間がかかります。もう1つは、この「機能」は不要です。別のアプローチを使用しても解決できないシナリオは考えられません。それは単にクリーンなコードではないと言われています。
Alexander Heim

@AlexanderHeim説明ありがとうございます。しかし、私が尋ねた理由は、それが答えの一部であるはずだからでした。
ニューロン

18

StringWrapperクラスCharacter、Byte などのプリミティブおよび不変クラスで機能します。

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

変更可能なクラスの場合

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

3つの参照と1つのオブジェクトが作成されます。すべての参照は同じオブジェクトを指しているため、プログラムは正しく動作しません。


2
「すべての参照が同じオブジェクトを指しているため、プログラムが正しく動作しません。」には同意しません。唯一の問題は、ある参照のオブジェクトに起こることが別の参照のオブジェクトに起こるということです-同じオブジェクトだからです。これは誤動作ではありません。それがJavaの仕組みです。
GKFX 2014

「誤動作」とはどういう意味ですか?それは異なった後、3別途初期化オブジェクトを動作しますが、それは本当に..あなたが望むものに依存
ニューロン

12

あなたはこれを行うことができます:

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

しかし、これらはすべて同じインスタンスを指します。最終的な変数やプリミティブ型で問題が発生することはありません。これにより、すべてを1行で実行できます。


2

私はあなたがすべての値を個別に設定する必要があるとは思わない(あなたが提供した最初の例のように)

2番目の例では、最後の変数を「」にのみ初期化し、他の変数は初期化しません。


0

これには遅すぎますが、私が見つけた最も簡単な方法は次のとおりです。

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

出力:

hello
hello
hello
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.