คุณใช้StringUtils.EMPTY
แทน""
?
ฉันหมายถึงเป็นค่าส่งคืนหรือถ้าคุณกำหนดค่าของตัวแปร String ฉันไม่ได้หมายถึงการเปรียบเทียบเพราะที่นั่นเราใช้StringUtils.isEmpty()
คุณใช้StringUtils.EMPTY
แทน""
?
ฉันหมายถึงเป็นค่าส่งคืนหรือถ้าคุณกำหนดค่าของตัวแปร String ฉันไม่ได้หมายถึงการเปรียบเทียบเพราะที่นั่นเราใช้StringUtils.isEmpty()
คำตอบ:
ไม่แน่นอน คุณคิดว่า "" ไม่ชัดเจนเพียงพอหรือไม่?
ค่าคงที่มี 3 กรณีการใช้งาน:
ไม่มีสมัครที่นี่
EMPTY
นี้ไม่มีความหมายใด ๆ ซึ่งสตริงว่างนั้นไม่มีอยู่แล้ว โดยเฉพาะอย่างยิ่งไม่มีเอกสารว่าทำไมคุณถึงตัดสินใจใช้สตริงว่างในกรณีนั้น ๆ ไม่ต่างอะไรกับการตั้งชื่อค่าคงที่ONE
และแสร้งว่ามีจุดหนึ่งในการใช้ค่าคงที่แทนค่า
ฉันใช้StringUtils.EMPTY
สำหรับซ่อนตัวอักษรและเพื่อแสดงสิ่งที่return StringUtils.EMPTY
คาดหวังอย่างเต็มที่และควรส่งคืนสตริงว่างเปล่า""
สามารถนำไปสู่สมมติฐานที่""
สามารถเปลี่ยนเป็นอย่างอื่นได้ง่ายและนี่อาจเป็นเพียงความผิดพลาด ฉันคิดว่าEMPTY
เป็นการแสดงออกมากกว่า
StringUtils.EMPTY
น้อย""
ที่แสดงออกมากกว่า
""
แสดงออกมากกว่าการใช้StringUtils.EMPTY
และสิ่งที่คุณพูดก็ไม่ได้เปลี่ยนความคิดของฉันในเรื่องนั้น ฉันสามารถเชื่อได้เลยว่านักพัฒนาได้เขียนตัวอักษรสตริงว่างอย่างไม่ถูกต้องเป็นครั้งคราว - แต่ฉันจะใช้ความชัดเจนของตัวอักษรสตริงมากกว่าหนึ่งในล้าน (และพบได้ง่ายในการทดสอบหวังว่า ... ) ข้อผิดพลาดโดยส่วนตัว
""
ไม่เพียงแค่ใช้
ตัวอักษร""
นั้นใสเหมือนคริสตัล ไม่มีความเข้าใจผิดว่าหมายถึงอะไร ฉันไม่รู้ว่าทำไมคุณถึงต้องการค่าคงที่ของคลาสสำหรับสิ่งนั้น ฉันเท่านั้นที่สามารถสรุปได้ว่าค่าคงที่นี้จะใช้ตลอดทั้งแพคเกจที่มีแทนStringUtils
""
นั่นไม่ได้หมายความว่าคุณควรใช้มัน
ถ้ามีหินบนทางเท้าคุณไม่ต้องโยนมัน
ฉันประหลาดใจที่มีคนจำนวนมากพอใจที่จะคิดแบบสุ่มสี่สุ่มห้าว่า "" เป็นสตริงว่างเปล่าและไม่มี (โดยบังเอิญ?) มีอักขระที่มองไม่เห็นและไม่เว้นวรรคที่ยอดเยี่ยมของ Unicode เพื่อความรักของทุกสิ่งที่ดีและเหมาะสมให้ใช้ EMPTY ทุกเมื่อที่ทำได้
ฉันจะเพิ่มสองเซ็นต์ของฉันที่นี่เพราะฉันไม่เห็นใครพูดถึงการString
ฝึกงานและการเริ่มต้นคลาส:
String
ตัวอักษรในแหล่ง Java เป็นฝึกงานทำให้ใด ๆ ""
และเดียวกันวัตถุStringUtils.EMPTY
StringUtils.EMPTY
สามารถเริ่มต้นStringUtils
คลาสได้เนื่องจากเข้าถึงสมาชิกแบบคงที่EMPTY
เฉพาะในกรณีที่ไม่ได้ประกาศไว้final
(JLS จะระบุเฉพาะในจุดนั้น) อย่างไรก็ตามถือเป็นที่สิ้นสุดดังนั้นจะไม่เริ่มต้นคลาสorg.apache.commons.lang3.StringUtils.EMPTY
ดูคำตอบที่เกี่ยวข้องบน String ฝึกงานและในระดับเริ่มต้นหมายถึงJLS 12.4.1
StringUtils
คลาสได้
ผมไม่ชอบที่จะใช้มันเป็นจะสั้นกว่าreturn "";
return StringUtils.EMPTY
อย่างไรก็ตามข้อดีที่ผิดพลาดอย่างหนึ่งของการใช้มันคือถ้าคุณพิมพ์return " ";
แทนคุณreturn "";
อาจพบพฤติกรรมที่แตกต่างออกไป (เกี่ยวกับว่าคุณทดสอบสตริงว่างอย่างถูกต้องหรือไม่)
""
ฉันเกลียดที่จะพิมพ์สตริงตัวอักษรเดียวกันมากกว่าหนึ่งครั้งแม้เพียงครั้งเดียวในบางครั้ง ฉันอยากจะประกาศค่าคงที่ในConstants.javaแต่อย่าทำซ้ำทุกที่ในซอร์สโค้ด
return "";
ว่าน่าเกลียดฉันชอบที่จะใช้ return StringUtil.EMPTY
(ประกาศในคลาสStringUtilของฉันเองไม่ใช่StringUtilsของ Apache )
หากชั้นเรียนของคุณไม่ได้ใช้สิ่งอื่นใดจากคอมมอนส์ก็น่าเสียดายที่จะมีการพึ่งพาเพียงแค่ค่าเวทมนตร์นี้
ผู้ออกแบบ StringUtils ใช้ค่าคงที่นี้อย่างหนักและเป็นสิ่งที่ถูกต้อง แต่ก็ไม่ได้หมายความว่าคุณควรใช้ด้วยเช่นกัน
จริงๆแล้วฉันไม่ค่อยเห็นการใช้ประโยชน์อย่างใดอย่างหนึ่ง หากคุณต้องการเปรียบเทียบกับสตริงว่างเพียงแค่ใช้StringUtils.isNotEmpty(..)
StringUtils.isNotEmpty(..)
ยังทำ nullcheck ดังนั้นจึงไม่เหมือนกับการเปรียบเทียบกับสตริงว่าง
null
อย่างไร? เป็นอาร์กิวเมนต์ที่ 2 equals
แต่ผลลัพธ์จะเหมือนกัน -false
isNotEmpty
อยู่ฝั่งตรงข้ามของ"".equals(…)
ดังนั้นข้อเท็จจริงที่ว่ามันจะปฏิบัติnull
เช่นสตริงที่ว่างเปล่าเป็นที่แตกต่างกันเพื่อเปรียบเทียบกับสตริงว่าง"".equals("")
→ true
, "".equals(null)
→ false
, StringUtils.isNotEmpty("")
→ false
, →StringUtils.isNotEmpty(null)
false
หากคุณต้องการทราบว่าสตริงว่างหรือไม่ให้ใช้string.isEmpty()
ซึ่งมีพฤติกรรมที่ถูกต้องในการส่งคืนtrue
iff เป็นสตริงว่างและโยนNullPointerException
ถ้าสตริงเป็นnull
...
ฉันพบว่าStringUtils.EMPTY
มีประโยชน์ในบางกรณีเพื่อความชัดเจน โดยเฉพาะกับ:
ตัวดำเนินการ Ternary เช่น
item.getId() != null ? item.getId() : StringUtils.EMPTY;
นอกจากนี้การใช้ค่าคงที่การอ้างอิงจะStringUtils.EMPTY
ถูกสร้างขึ้น มิฉะนั้นหากคุณพยายามสร้างอินสแตนซ์ String literal ""
ทุกครั้งที่ JVM จะต้องตรวจสอบว่ามีอยู่ใน String pool แล้วหรือไม่ (ซึ่งน่าจะเป็นไปได้ดังนั้นจึงไม่มีค่าใช้จ่ายในการสร้างอินสแตนซ์เพิ่มเติม การใช้StringUtils.EMPTY
หลีกเลี่ยงความจำเป็นในการตรวจสอบ String pool หรือไม่?
StringUtils.EMPTY
ค่าคงที่จะได้รับการแก้ไขในเวลาคอมไพล์
StringUtil.EMPTY
เป็นค่าคงที่เวลาคอมไพล์การอ้างอิงถึงจะถูกคอมไพล์เป็นไบต์โค้ดเดียวกันกับการใช้""
โดยตรง นอกจากนี้ฉันไม่เห็นว่าเหตุใดตัวดำเนินการด้านท้ายจึงควรสร้างความแตกต่าง มันเป็นการแสดงออกที่ไม่เหมือนใคร เหตุผลใด ๆ ที่จะใช้หรือไม่ใช้ค่าคงที่ที่ระบุชื่อก็ใช้ได้กับตัวดำเนินการด้านท้ายเช่นกัน
ไม่เพราะฉันมีอะไรจะเขียนมากกว่านี้ และสตริงว่างคือ plattform อิสระว่างเปล่า (ใน Java)
File.separator
ดีกว่า "/" หรือ "\"
แต่ทำตามใจชอบ. คุณไม่สามารถพิมพ์ผิดได้เช่นreturn " ";
someString.isEmpty()
แทน
ฉันขอแนะนำให้ใช้ค่าคงที่นี้เป็นหนึ่งในโครงสร้างพื้นฐานของรหัสที่แข็งแกร่งเพื่อลดความเสี่ยงที่จะมีอักขระที่มองไม่เห็นแอบเข้ามาโดยบังเอิญเมื่อกำหนดสตริงว่างให้กับตัวแปร
หากคุณมีผู้คนจากทั่วทุกมุมโลกอยู่ในทีมของคุณและอาจมีบางคนที่ไม่ค่อยมีประสบการณ์ดังนั้นคุณควรยืนยันที่จะใช้ค่าคงที่นี้ในโค้ด
มีภาษาต่างๆมากมายและผู้คนใช้การตั้งค่าตัวอักษรในท้องถิ่นของตนเองบนคอมพิวเตอร์ บางครั้งพวกเขาก็ลืมที่จะเปลี่ยนกลับในขณะที่เขียนโค้ดและหลังจากที่พวกเขาเปลี่ยนและลบด้วย backspace โปรแกรมแก้ไขข้อความสามารถทิ้งขยะไว้ใน "" ได้ ใช้StringUtils.EMPTY
เพียงแค่กำจัดความเสี่ยงนั้น
อย่างไรก็ตามสิ่งนี้ไม่มีผลกระทบอย่างมีนัยสำคัญต่อประสิทธิภาพของโค้ดหรือความสามารถในการอ่านโค้ด นอกจากนี้ยังไม่สามารถแก้ไขปัญหาพื้นฐานบางอย่างที่คุณอาจประสบได้ดังนั้นจึงขึ้นอยู่กับสภาพอากาศในการตัดสินที่ดีของคุณว่าคุณจะใช้ค่าคงที่นี้หรือไม่
ใช่มันสมเหตุสมผลแล้ว มันอาจจะไม่ใช่วิธีเดียวที่จะไป แต่ฉันเห็นน้อยมากที่จะพูดว่า "ไม่สมเหตุสมผล"
ในความเห็นของฉัน:
It will still require changing everywhere if you don't define your own variable and use it in multiple places.
คุณจะเปลี่ยนสตริงว่างเป็นสตริงว่างอื่น?
StringUtils.EMPTY
. ทำให้ชัดเจนว่าการใช้ String ว่างนั้นมีจุดมุ่งหมายและไม่ใช่ความเกียจคร้าน ("โอ้นี่ต้องใช้ String ผ่านไปเถอะ""
") หากมีคนกดรหัสนี้เขาจะคิดทบทวนก่อนที่จะทำการเปลี่ยนแปลง นอกจากนี้หากStringUtils.EMPTY
กำหนดให้เป็นตัวแปรของคุณเองเช่นMyClass.EMPTY
การเปลี่ยนแปลง "ที่แสดงถึงความว่างเปล่า" จะต้องมีการเปลี่ยนโค้ดหนึ่งบรรทัด ตัวอย่างเช่นคุณสามารถเปลี่ยน"<empty>"
เป็นสตริงว่าง""
แทน แต่ฉันคิดว่านี่มันเกินไปหน่อย