แนะนำให้ใช้ StringUtils.EMPTY หรือไม่


93

คุณใช้StringUtils.EMPTYแทน""?

ฉันหมายถึงเป็นค่าส่งคืนหรือถ้าคุณกำหนดค่าของตัวแปร String ฉันไม่ได้หมายถึงการเปรียบเทียบเพราะที่นั่นเราใช้StringUtils.isEmpty()

คำตอบ:


113

ไม่แน่นอน คุณคิดว่า "" ไม่ชัดเจนเพียงพอหรือไม่?

ค่าคงที่มี 3 กรณีการใช้งาน:

  1. บันทึกความหมายของค่า (พร้อมชื่อคงที่ + javadoc)
  2. ซิงโครไนซ์ไคลเอนต์กับค่าทั่วไป
  3. ระบุทางลัดไปยังค่าพิเศษเพื่อหลีกเลี่ยงต้นทุนเริ่มต้นบางอย่าง

ไม่มีสมัครที่นี่


34
ฉันยังคงเห็นกรณีการใช้งานเล็กน้อยและหายากสำหรับStringUtils.EMPTY. ทำให้ชัดเจนว่าการใช้ String ว่างนั้นมีจุดมุ่งหมายและไม่ใช่ความเกียจคร้าน ("โอ้นี่ต้องใช้ String ผ่านไปเถอะ""") หากมีคนกดรหัสนี้เขาจะคิดทบทวนก่อนที่จะทำการเปลี่ยนแปลง นอกจากนี้หากStringUtils.EMPTYกำหนดให้เป็นตัวแปรของคุณเองเช่นMyClass.EMPTYการเปลี่ยนแปลง "ที่แสดงถึงความว่างเปล่า" จะต้องมีการเปลี่ยนโค้ดหนึ่งบรรทัด ตัวอย่างเช่นคุณสามารถเปลี่ยน"<empty>"เป็นสตริงว่าง""แทน แต่ฉันคิดว่านี่มันเกินไปหน่อย
Timmos

5
ในที่สุดฉันก็มีข้อโต้แย้งที่ดีที่จะส่งต่อความกระตือรือร้นให้แทนที่จะคิดด้วยตัวเองทุกครั้ง ขอบคุณ.
Alex

2
EMPTY ขาดความหมายอย่างไร? EMPTY ตอบสนองทั้ง 1 และ 2 ในรายการของคุณ นักพัฒนาที่มากประสบการณ์กำลังประเมินศักยภาพของนักพัฒนารุ่นน้องน้อยเกินไปที่จะทำอะไรบางอย่างที่เรียบง่ายอย่างการใช้ ""
Andrew T Finnell

5
@AndrewTFinnell ชื่อEMPTYนี้ไม่มีความหมายใด ๆ ซึ่งสตริงว่างนั้นไม่มีอยู่แล้ว โดยเฉพาะอย่างยิ่งไม่มีเอกสารว่าทำไมคุณถึงตัดสินใจใช้สตริงว่างในกรณีนั้น ๆ ไม่ต่างอะไรกับการตั้งชื่อค่าคงที่ONEและแสร้งว่ามีจุดหนึ่งในการใช้ค่าคงที่แทนค่า
Holger

6
โหวตลงเพราะไม่จริงฉันไม่คิดว่า "" ชัดเจนพอ :( ว่างหรือเปล่าว่างไหมมีช่องว่างในนั้นฉันมองไม่เห็นเพราะขนาดตัวอักษรของฉันเล็กหรือไม่มันตั้งใจที่จะ ว่างเปล่ามีตัวอักษร "ล่องหน" แปลก ๆ ไหม
Dan Rayson

61

ฉันใช้StringUtils.EMPTYสำหรับซ่อนตัวอักษรและเพื่อแสดงสิ่งที่return StringUtils.EMPTYคาดหวังอย่างเต็มที่และควรส่งคืนสตริงว่างเปล่า""สามารถนำไปสู่สมมติฐานที่""สามารถเปลี่ยนเป็นอย่างอื่นได้ง่ายและนี่อาจเป็นเพียงความผิดพลาด ฉันคิดว่าEMPTYเป็นการแสดงออกมากกว่า


37
ตามคนอื่น ๆ ที่แนะนำสิ่งนี้: คุณใช้ ZERO สำหรับ 0 และ ONE สำหรับ 1 ด้วยหรือไม่
Jon Skeet

9
ฉันจะไม่เปรียบเทียบกรณี 'ว่าง' พิเศษกับการใช้ลิเทอรัลจำนวนเต็ม
Christopher Klewes

18
ผมพบStringUtils.EMPTY น้อย""ที่แสดงออกมากกว่า
bacar

1
@JonSkeet เคารพคุณมาก ฉันรู้สึกว่าคุณพูดไม่ถูกที่นี่ แม้ว่าคุณและฉันอาจไม่เคยพบเจอสิ่งนี้ แต่ก็มีกรณีที่ต้องไม่ใช้ตัวอักษร "" เนื่องจากไม่มีการตรวจสอบไวยากรณ์ว่านักพัฒนาทำผิดพลาดหรือไม่ และใช่ฉันเคยเห็นนักพัฒนารุ่นเยาว์ทำเรื่องง่ายๆเช่น "" ฉันไม่คิดที่จะเปลี่ยน EMPTY ให้เป็นความหมายอย่างอื่นที่ไม่ใช่ "" ฉันชอบแนวคิดเรื่อง EMPTY เพราะคอมไพเลอร์สามารถเข้าใจความหมายได้เท่านั้น
Andrew T Finnell

@AndrewTFinnell: "ไม่ถูกต้อง" เป็นคำที่แปลกสำหรับสิ่งที่ต้องเป็นเรื่องส่วนตัวอย่างแน่นอน ไม่ฉันไม่คาดหวังว่า EMPTY จะเคยเปลี่ยนความหมาย แต่ฉันชอบ bacar - พบว่า""แสดงออกมากกว่าการใช้StringUtils.EMPTYและสิ่งที่คุณพูดก็ไม่ได้เปลี่ยนความคิดของฉันในเรื่องนั้น ฉันสามารถเชื่อได้เลยว่านักพัฒนาได้เขียนตัวอักษรสตริงว่างอย่างไม่ถูกต้องเป็นครั้งคราว - แต่ฉันจะใช้ความชัดเจนของตัวอักษรสตริงมากกว่าหนึ่งในล้าน (และพบได้ง่ายในการทดสอบหวังว่า ... ) ข้อผิดพลาดโดยส่วนตัว
Jon Skeet

31

""ไม่เพียงแค่ใช้

ตัวอักษร""นั้นใสเหมือนคริสตัล ไม่มีความเข้าใจผิดว่าหมายถึงอะไร ฉันไม่รู้ว่าทำไมคุณถึงต้องการค่าคงที่ของคลาสสำหรับสิ่งนั้น ฉันเท่านั้นที่สามารถสรุปได้ว่าค่าคงที่นี้จะใช้ตลอดทั้งแพคเกจที่มีแทนStringUtils ""นั่นไม่ได้หมายความว่าคุณควรใช้มัน

ถ้ามีหินบนทางเท้าคุณไม่ต้องโยนมัน


6
"ถ้ามีหินบนทางเท้าก็ไม่ต้องขว้าง" บอกลูกชายวัย 6 ขวบ
roel

16

ฉันประหลาดใจที่มีคนจำนวนมากพอใจที่จะคิดแบบสุ่มสี่สุ่มห้าว่า "" เป็นสตริงว่างเปล่าและไม่มี (โดยบังเอิญ?) มีอักขระที่มองไม่เห็นและไม่เว้นวรรคที่ยอดเยี่ยมของ Unicode เพื่อความรักของทุกสิ่งที่ดีและเหมาะสมให้ใช้ EMPTY ทุกเมื่อที่ทำได้


4
ฉันอยากรู้ - คุณเคยเห็นสิ่งนี้เกิดขึ้นในรหัสหรือไม่? ถ้าเป็นเช่นนั้นมันบังเอิญหรือตั้งใจ? ดูเหมือนจะยากที่จะทำโดยไม่ตั้งใจและถ้าตั้งใจฉันก็สามารถสร้างคลาส StringUtils ของตัวเองได้อย่างง่ายดายด้วยค่าคงที่ EMPTY ที่ไม่ว่างเปล่าและอ้างถึงสิ่งนั้น
Ian Robertson

5
@IanRobertson ใช่ฉันเคยเห็นสิ่งนี้เกิดขึ้น ค่อนข้างบ่อยจริง ผู้คนตัดและวางจากเว็บไซต์ตลอดเวลาและจากชุดรหัสหนึ่งไปยังชุดรหัสอื่น นอกจากนี้ยังมี บริษัท ที่ยังคงใช้ Clear Case ซึ่งใช้ชุดรหัสโบราณซึ่งจะถูกแปลเป็นชุด Windows ISO แบบสุ่มจากนั้นจะแปลเป็น UTF-8 หากคุณย้ายไปที่ Git ฉันใช้เวลานับไม่ถ้วนในการแก้ไขปัญหาชุดโค้ด รวมทั้งอันนี้
Andrew T Finnell

3
@AndrewTFinnell ฉันสามารถเห็นได้อย่างแน่นอนว่าโดยทั่วไปแล้วอาจทำให้เกิดปัญหาได้อย่างไร แต่คุณเห็นค่าคงที่ของสตริงที่ดูว่างเปล่าโดยเฉพาะบ่อยแค่ไหน?
Ian Robertson

15

ฉันจะเพิ่มสองเซ็นต์ของฉันที่นี่เพราะฉันไม่เห็นใครพูดถึงการStringฝึกงานและการเริ่มต้นคลาส:

  • ทุกStringตัวอักษรในแหล่ง Java เป็นฝึกงานทำให้ใด ๆ ""และเดียวกันวัตถุStringUtils.EMPTY
  • การใช้StringUtils.EMPTY สามารถเริ่มต้นStringUtilsคลาสได้เนื่องจากเข้าถึงสมาชิกแบบคงที่EMPTY เฉพาะในกรณีที่ไม่ได้ประกาศไว้final (JLS จะระบุเฉพาะในจุดนั้น) อย่างไรก็ตามถือเป็นที่สิ้นสุดดังนั้นจะไม่เริ่มต้นคลาสorg.apache.commons.lang3.StringUtils.EMPTY

ดูคำตอบที่เกี่ยวข้องบน String ฝึกงานและในระดับเริ่มต้นหมายถึงJLS 12.4.1


“ เฉพาะในกรณีที่ไม่ได้ประกาศเป็นที่สิ้นสุด” ดังนั้นเนื่องจากฟิลด์นี้ถูกประกาศเป็นที่สิ้นสุดการเข้าถึงจึงไม่สามารถทำให้เกิดการเริ่มต้นของStringUtilsคลาสได้
Holger

@Holger นั่นเป็นคำสั่งทั่วไป แต่จริงๆแล้วฉันแก้ไขด้วยลิงค์ไปยัง javadoc ที่แสดงว่ามันเป็นที่สิ้นสุด (และจะไม่เริ่มต้นคลาส)
Matthieu

9

ผมไม่ชอบที่จะใช้มันเป็นจะสั้นกว่าreturn "";return StringUtils.EMPTY

อย่างไรก็ตามข้อดีที่ผิดพลาดอย่างหนึ่งของการใช้มันคือถ้าคุณพิมพ์return " ";แทนคุณreturn "";อาจพบพฤติกรรมที่แตกต่างออกไป (เกี่ยวกับว่าคุณทดสอบสตริงว่างอย่างถูกต้องหรือไม่)


13
คุณเคยสังเกตไหมว่าปัญหานี้เป็นปัญหา (โดยใช้ "" โดยบังเอิญในที่ที่คุณหมายถึง "") โดยส่วนตัวแล้วฉันพบว่าตัวอักษรอ่านง่ายกว่าและไม่เคยทำให้ฉันมีปัญหาใด ๆ
Jon Skeet

2
@ จอนไม่จริง แต่ฉันพยายามหาข้อได้เปรียบจากการใช้มัน;)
Romain Linsolas

1
ไม่มีกฎเวลาเท่ากัน ถ้าไม่มีข้อได้เปรียบก็ไม่มีประโยชน์
Erick Robertson

1
ฉันไม่ชอบ""ฉันเกลียดที่จะพิมพ์สตริงตัวอักษรเดียวกันมากกว่าหนึ่งครั้งแม้เพียงครั้งเดียวในบางครั้ง ฉันอยากจะประกาศค่าคงที่ในConstants.javaแต่อย่าทำซ้ำทุกที่ในซอร์สโค้ด
賈可 Jacky

2
ฉันคิด return "";ว่าน่าเกลียดฉันชอบที่จะใช้ return StringUtil.EMPTY(ประกาศในคลาสStringUtilของฉันเองไม่ใช่StringUtilsของ Apache )
賈可 Jacky

6

หากชั้นเรียนของคุณไม่ได้ใช้สิ่งอื่นใดจากคอมมอนส์ก็น่าเสียดายที่จะมีการพึ่งพาเพียงแค่ค่าเวทมนตร์นี้

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


ฉันหมายความว่ามันยอมรับได้เนื่องจากผู้เขียนเลือกที่จะไปทางนี้ (หลีกเลี่ยงการใช้ "ค่าเวทมนตร์") ควรเป็นส่วนตัวแม้ว่า
cherouvim

ผู้เขียนใช้ 0 บ่อยในโค้ด จะดีกว่าไหมหากพวกเขากำหนดค่าคงที่ int ZERO = 0 ด้วย ถ้าไม่แตกต่างกันอย่างไร?
Jon Skeet

6
มันขึ้นอยู่กับบริบท ถ้านี่คือ FCKEditorStringUtils EMPTY ของพวกเขาจะเป็น "<p> & nbsp </p>" และฉันอยากเห็น EMPTY ถูกนำมาใช้แทนการจำลองค่าเวทมนตร์นี้ทุกที่ในคลาส ดังนั้นโดย EMPTY อาจหมายถึง EMPTY_CONTENT ไม่ใช่ EMPTY_STRING (ดังนั้นตัวอย่าง ZERO ของคุณจึงไม่ยุติธรรมเล็กน้อย) คุณจะไม่ใช้ค่าคงที่ ERROR_VISA_INVALID = 0 ซ้ำอีกหรือ
cherouvim

1

จริงๆแล้วฉันไม่ค่อยเห็นการใช้ประโยชน์อย่างใดอย่างหนึ่ง หากคุณต้องการเปรียบเทียบกับสตริงว่างเพียงแค่ใช้StringUtils.isNotEmpty(..)


2
StringUtils.isNotEmpty(..)ยังทำ nullcheck ดังนั้นจึงไม่เหมือนกับการเปรียบเทียบกับสตริงว่าง
cherouvim

และคุณจะตั้งแคมป์nullอย่างไร? เป็นอาร์กิวเมนต์ที่ 2 equalsแต่ผลลัพธ์จะเหมือนกัน -false
Bozho

isNotEmptyอยู่ฝั่งตรงข้ามของ"".equals(…)ดังนั้นข้อเท็จจริงที่ว่ามันจะปฏิบัติnullเช่นสตริงที่ว่างเปล่าเป็นที่แตกต่างกันเพื่อเปรียบเทียบกับสตริงว่าง"".equals("")true, "".equals(null)false, StringUtils.isNotEmpty("")false, →StringUtils.isNotEmpty(null) falseหากคุณต้องการทราบว่าสตริงว่างหรือไม่ให้ใช้string.isEmpty()ซึ่งมีพฤติกรรมที่ถูกต้องในการส่งคืนtrueiff เป็นสตริงว่างและโยนNullPointerExceptionถ้าสตริงเป็นnull...
Holger

1

ฉันพบว่าStringUtils.EMPTYมีประโยชน์ในบางกรณีเพื่อความชัดเจน โดยเฉพาะกับ:

  1. ตัวดำเนินการ Ternary เช่น

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
    
  2. ส่งคืนสตริงว่างจากเมธอดเพื่อยืนยันว่าใช่ฉันต้องการทำเช่นนั้นจริงๆ

นอกจากนี้การใช้ค่าคงที่การอ้างอิงจะStringUtils.EMPTYถูกสร้างขึ้น มิฉะนั้นหากคุณพยายามสร้างอินสแตนซ์ String literal ""ทุกครั้งที่ JVM จะต้องตรวจสอบว่ามีอยู่ใน String pool แล้วหรือไม่ (ซึ่งน่าจะเป็นไปได้ดังนั้นจึงไม่มีค่าใช้จ่ายในการสร้างอินสแตนซ์เพิ่มเติม การใช้StringUtils.EMPTYหลีกเลี่ยงความจำเป็นในการตรวจสอบ String pool หรือไม่?


4
การโต้แย้งของคุณกับการค้นหาหลายรายการไม่ถือ ในบทที่ 13.4.9 ของข้อกำหนดภาษา Java 3.0 ได้กล่าวถึงStringUtils.EMPTYค่าคงที่จะได้รับการแก้ไขในเวลาคอมไพล์
Roland Illig

4
การมีอยู่ในพูลสตริงจะถูกตรวจสอบที่เวลาคอมไพล์และเวลาโหลดคลาสไม่ใช่ที่รันไทม์ตลอดเวลาที่คุณดำเนินการคำสั่งดังกล่าว
user207421

1
เนื่องจากStringUtil.EMPTYเป็นค่าคงที่เวลาคอมไพล์การอ้างอิงถึงจะถูกคอมไพล์เป็นไบต์โค้ดเดียวกันกับการใช้""โดยตรง นอกจากนี้ฉันไม่เห็นว่าเหตุใดตัวดำเนินการด้านท้ายจึงควรสร้างความแตกต่าง มันเป็นการแสดงออกที่ไม่เหมือนใคร เหตุผลใด ๆ ที่จะใช้หรือไม่ใช้ค่าคงที่ที่ระบุชื่อก็ใช้ได้กับตัวดำเนินการด้านท้ายเช่นกัน
Holger

1

ไม่เพราะฉันมีอะไรจะเขียนมากกว่านี้ และสตริงว่างคือ plattform อิสระว่างเปล่า (ใน Java)

File.separator ดีกว่า "/" หรือ "\"

แต่ทำตามใจชอบ. คุณไม่สามารถพิมพ์ผิดได้เช่นreturn " ";


7
ฉันไม่เข้าใจว่าทำไมโปรแกรมเมอร์ส่วนใหญ่จึงกลัวการเขียน "มากเกินไป" ด้วยการเขียน StringUtils.EMPTY คุณจะได้รับรหัสการแสดงความคิดเห็นด้วยตนเองซึ่งเป็นรหัสที่อ่านง่ายกว่า และตามที่ Steve McConnell (หรือการศึกษาบางชิ้นที่เขายกมาใน Code Complete 2.0) นั้นอ่านมากกว่าที่เขียนถึง 7 เท่า
Paweł Dyda

1
คุณมีสิทธิ์โดยเฉพาะ แต่: "" .equals (someString) นั้นอ่านง่ายเหมือน StringUtils.EMPTY.equals (someString)
Christian Kuetbach

StringUtils.EMPTY.equals (someString) จะทำให้เกิดข้อผิดพลาดทางไวยากรณ์หากคุณเขียนไม่ถูกต้อง "" .equals (someString) จะไม่ นี่เป็นเหตุผลเดียวที่ต้องใช้ EMPTY
Andrew T Finnell

1
@AndrewTFinnell นั่นคือเหตุผลที่โปรแกรมเมอร์ที่มีสติเขียนsomeString.isEmpty()แทน
Holger

0

ฉันขอแนะนำให้ใช้ค่าคงที่นี้เป็นหนึ่งในโครงสร้างพื้นฐานของรหัสที่แข็งแกร่งเพื่อลดความเสี่ยงที่จะมีอักขระที่มองไม่เห็นแอบเข้ามาโดยบังเอิญเมื่อกำหนดสตริงว่างให้กับตัวแปร

หากคุณมีผู้คนจากทั่วทุกมุมโลกอยู่ในทีมของคุณและอาจมีบางคนที่ไม่ค่อยมีประสบการณ์ดังนั้นคุณควรยืนยันที่จะใช้ค่าคงที่นี้ในโค้ด

มีภาษาต่างๆมากมายและผู้คนใช้การตั้งค่าตัวอักษรในท้องถิ่นของตนเองบนคอมพิวเตอร์ บางครั้งพวกเขาก็ลืมที่จะเปลี่ยนกลับในขณะที่เขียนโค้ดและหลังจากที่พวกเขาเปลี่ยนและลบด้วย backspace โปรแกรมแก้ไขข้อความสามารถทิ้งขยะไว้ใน "" ได้ ใช้StringUtils.EMPTYเพียงแค่กำจัดความเสี่ยงนั้น

อย่างไรก็ตามสิ่งนี้ไม่มีผลกระทบอย่างมีนัยสำคัญต่อประสิทธิภาพของโค้ดหรือความสามารถในการอ่านโค้ด นอกจากนี้ยังไม่สามารถแก้ไขปัญหาพื้นฐานบางอย่างที่คุณอาจประสบได้ดังนั้นจึงขึ้นอยู่กับสภาพอากาศในการตัดสินที่ดีของคุณว่าคุณจะใช้ค่าคงที่นี้หรือไม่


-2

ใช่มันสมเหตุสมผลแล้ว มันอาจจะไม่ใช่วิธีเดียวที่จะไป แต่ฉันเห็นน้อยมากที่จะพูดว่า "ไม่สมเหตุสมผล"

ในความเห็นของฉัน:

  • มันโดดเด่นกว่า ""
  • มันอธิบายว่าคุณหมายถึงว่างเปล่าและช่องว่างนั้นจะไม่เกิดขึ้น
  • ยังคงต้องมีการเปลี่ยนแปลงทุกที่หากคุณไม่ได้กำหนดตัวแปรของคุณเองและใช้ในหลาย ๆ ที่
  • หากคุณไม่อนุญาตให้ใช้ตัวอักษรสตริงฟรีในโค้ดสิ่งนี้จะช่วยได้

It will still require changing everywhere if you don't define your own variable and use it in multiple places.คุณจะเปลี่ยนสตริงว่างเป็นสตริงว่างอื่น?
Pita

@Pita ขออภัยที่ใช้ถ้อยคำไม่ดี ฉันตั้งใจจะบอกว่าหากคุณใช้อินไลน์นี้แทน "" คุณจะยังไม่ได้รับประโยชน์เช่นเดียวกับการกำหนดค่าคงที่ของคุณเองและนำกลับมาใช้ในหลาย ๆ ที่ ไม่ใช่ข้อโต้แย้งสำหรับ StringUtils.EMPTY มันเป็นคำอธิบายที่คุณไม่ได้รับมากนักแม้ว่ามันจะ 'สมเหตุสมผล' ก็ตาม โดยส่วนตัวแล้วฉันจะสร้างค่าคงที่ด้วยชื่อที่สื่อความหมายจากนั้นจึงกำหนดค่านี้ ฉันเคยเห็นบางกรณีที่นักพัฒนาต้องการเว้นวรรคเดียวและจบลงด้วยสตริงว่างเปล่าซึ่งไม่ได้เกิดขึ้นกับแบบฟอร์มนี้
Oron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.