การเริ่มต้นตัวแปรหลายตัวให้เป็นค่าเดียวกันใน Java


214

ฉันกำลังมองหาวิธีที่สะอาดและมีประสิทธิภาพในการประกาศตัวแปรหลายตัวที่เป็นประเภทเดียวกันและมีค่าเท่ากัน ตอนนี้ฉันมี:

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

แต่ฉันกำลังมองหาบางสิ่งที่ชอบ:

String one,two,three = ""

นี่เป็นสิ่งที่สามารถทำได้ใน java หรือไม่? การรักษาประสิทธิภาพไว้ในใจ


5
รักษาประสิทธิภาพไว้ในใจประสิทธิภาพของอะไร
khachik

15
ความยาวของรหัสเวลาพิมพ์ง่าย ๆ นั่นคือสิ่งที่ฉันหมายถึง ฉันรู้ว่าหน่วยความจำสำรองกำลังสำรองหน่วยความจำและคำถามนี้เกี่ยวข้องกับด้าน 'มนุษย์' ของสิ่งต่าง ๆ
83643

1
ฉันจะบอกว่านี่เป็นการต่อต้านจาวาที่ยอมรับโดยทั่วไปมันจะทำให้ผู้อ่านประหลาดใจและ IMHO นั้นอ่านได้ยากกว่าการประกาศในบรรทัดแยกกัน
สิเมโอน

4
ฉันตรวจสอบประสิทธิภาพ (ใน java 8) a = b = c = d = e = true ใช้เวลา 2x + คูณกว่า a = true; b = จริง และอื่น ๆ
Amit Kumar Gupta

คำตอบ:


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
มีหลายกรณีที่สิ่งนี้เหมาะสมสำหรับวัตถุที่ไม่แน่นอนเช่นกัน ตัวอย่างเช่นในตัวสร้างของการใช้งานรายการที่เชื่อมโยงที่เริ่มต้น: หัว = tail = โหนดใหม่ (ค่า) ดังนั้นทั้งศีรษะและหางควรชี้ไปที่การอ้างอิงเดียวกัน
bcorso

สิ่งเหล่านี้เป็นวัตถุเดียวกันหรือไม่ หากภายหลังฉันone = "cat"จะtwo.equals("cat")กลับมาจริงหรือไม่
Aequitas

ข้อแม้เดียวคือสิ่งนี้จะไม่ทำงานกับตัวแปรแบบคงที่
IgorGanapolsky

สิ่งที่เกี่ยวกับการประกาศจำนวนเต็ม?
IgorGanapolsky

เหตุใดจึงไม่ทำงานกับปฏิทิน หากคุณทำเช่นนั้นตัวแปรทุกตัวจะทำงานเหมือนกันเมื่อคุณปรับใช้หนึ่งในนั้น
TheCrazyProfessor

59

คุณสามารถประกาศตัวแปรหลายตัวและเริ่มต้นตัวแปรหลายตัว แต่ไม่ใช่ทั้งสองอย่างในเวลาเดียวกัน:

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

อย่างไรก็ตามสิ่งนี้ (โดยเฉพาะการมอบหมายหลายอย่าง) จะถูกขมวดคิ้วโดยนักพัฒนา Java ส่วนใหญ่ซึ่งจะถือว่ามันตรงกันข้ามกับ "วิชวลวิชั่น"


24
+1 สำหรับการชี้ให้เห็นว่าสิ่งที่เขาพยายามทำไม่ใช่บรรทัดฐาน
Brian Roach

นี่สำหรับ String แต่จะเป็นจำนวนเต็มอย่างไร? int วัน, เดือน, ปี, ชั่วโมง, นาที = วัน = เดือน = ปี = ชั่วโมง = 0; ถูกต้องหรือไม่?
Ranjit

23

ไม่เป็นไปไม่ได้ใน java

คุณสามารถทำสิ่งนี้ได้ .. แต่พยายามหลีกเลี่ยงมัน

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

8
คุณช่วยอธิบายได้ไหมว่าทำไมจึงควรหลีกเลี่ยงสิ่งนี้
Neuron

@ Lonely Neuron ฉันคิดว่ามันง่ายที่จะทำผิดถ้าคุณใช้วิธีนี้
Yuhang Lin

3
@YuhangLin ฉันแค่หวังว่าจะได้คำตอบที่ดีกว่า
Neuron

@ LonelyNeuron ดีสำหรับคนที่ช้ากว่า ใช้เวลาเกือบสองเท่าราวกับว่าคุณเพิ่งเริ่มต้นแยกกัน หนึ่งคุณลักษณะ "อื่น ๆ " นี้ไม่จำเป็น ฉันไม่สามารถนึกถึงสถานการณ์ที่ไม่สามารถแก้ไขได้โดยใช้วิธีการอื่น เพียงกล่าวว่าไม่ใช่รหัสที่สะอาด
Alexander Heim

@AlexanderHeim ขอบคุณสำหรับคำอธิบาย แต่เหตุผลที่ฉันถามก็เพราะมันควรเป็นส่วนหนึ่งของคำตอบ
Neuron

18

ใช้งานได้กับคลาสพื้นฐานและคลาสที่ไม่เปลี่ยนรูปเช่นStringWrapper คลาส Character, Byte

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

สำหรับคลาสที่ไม่แน่นอน

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

มีการสร้างการอ้างอิงสามรายการ + หนึ่งวัตถุ การอ้างอิงทั้งหมดชี้ไปที่วัตถุเดียวกันและโปรแกรมของคุณจะทำงานผิดปกติ


2
ฉันไม่เห็นด้วยกับ "การอ้างอิงทั้งหมดชี้ไปที่วัตถุเดียวกันและโปรแกรมของคุณจะทำงานผิดปกติ" ปัญหาเดียวคือสิ่งที่เกิดขึ้นกับวัตถุของการอ้างอิงหนึ่งเกิดขึ้นกับวัตถุของการอ้างอิงอื่น - เพราะมันเป็นวัตถุเดียวกัน นี่ไม่ใช่พฤติกรรมที่ไม่เหมาะสม มันเป็นวิธีการทำงานของจาวา
GKFX

คุณหมายความว่าอย่างไรกับ "misbehave" มันจะทำงานแตกต่างกันแล้ว 3 วัตถุ initialised แยกกัน แต่จริงๆมันขึ้นอยู่กับสิ่งที่คุณต้องการ ..
Neuron

12

คุณสามารถทำได้:

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

แต่สิ่งเหล่านี้จะชี้ไปที่อินสแตนซ์เดียวกัน มันจะไม่ทำให้เกิดปัญหากับตัวแปรสุดท้ายหรือชนิดดั้งเดิม ด้วยวิธีนี้คุณสามารถทำทุกอย่างในบรรทัดเดียว


2

ฉันไม่คิดว่าเป็นไปได้ที่คุณจะต้องตั้งค่า individualling ทั้งหมด (เช่นตัวอย่างแรกที่คุณให้ไว้)

ตัวอย่างที่สองที่คุณให้ไว้จะเริ่มต้นค่าตัวแปรสุดท้ายเป็น "" เท่านั้นไม่ใช่ค่าอื่น ๆ


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.