เหตุใด CharSequence จึงไม่ประกอบด้วย (CharSequence)


11

สิ่งนี้ใช้กับทั้ง Java SE และ Android เนื่องจากสัญญาเหมือนกัน

CharSequenceไม่ได้กำหนดcontains(CharSequence)วิธีการ ฉันไม่สามารถหาเหตุผลว่าทำไมและรวมถึงมันจะมีประโยชน์มากทำให้ไม่ต้องโทรCharSequence#toString()เพื่อตรวจสอบลำดับของอักขระ

ยกตัวอย่างเช่นใน Android ของผู้ใช้ที่ถูกบังคับให้โทรEditable#toString()เพื่อดูว่าจะมีลำดับของอักขระแม้ว่าEditableการดำเนินการCharSequenceซึ่งสามารถหลีกเลี่ยงได้ถ้ากำหนดไว้CharSequencecontains(CharSequence)

แนวคิดเบื้องหลังตัวเลือกการออกแบบนี้คืออะไร มันเป็นการกำกับดูแลที่มีศักยภาพหรือมีเหตุผลในการออกแบบสำหรับเรื่องนี้?

คำตอบ:


10

ประเด็นCharSequenceคือเพื่อให้มุมมองแบบอ่านอย่างเดียวกับลำดับตัวอักษรและนั่นคือมัน อินเตอร์เฟสนี้ไม่มีการจัดการสตริงหรือวิธีการค้นหาใด ๆ สิ่งเหล่านั้นอยู่นอกขอบเขต

หลักการแยกส่วนต่อประสานแสดงให้เห็นว่าลูกค้าประเภทไม่ควรพึ่งพาวิธีการที่พวกเขาไม่ได้ใช้ ดังนั้นอินเตอร์เฟสควรประกาศเฉพาะชุดที่มีประโยชน์น้อยที่สุดเท่านั้น หากกรณีการใช้งานที่แตกต่างกันต้องการวิธีการที่แตกต่างกันควรมีอินเตอร์เฟซที่แตกต่างกัน

ไคลเอนต์ที่ต้องการแหล่งอักขระเท่านั้นอาจไม่ต้องการวิธีการค้นหา

แน่นอนว่าเป็นไปได้ที่จะหักล้างหลักการนี้และจบลงด้วยอินเตอร์เฟซเล็ก ๆ น้อย ๆ นับพัน ไม่ดีเหมือนกัน ดังนั้นCharSequenceอินเตอร์เฟซที่ไม่เพียง แต่มีน้อยที่สุดcharAt()และlength()วิธีการ subSequence()แต่ยังเป็นวิธีที่สะดวกสบายที่เกี่ยวข้องอย่างลึกซึ้ง (CharSequence สามารถให้มุมมองในการเรียงลำดับโดยไม่ต้องคัดลอกสตริงซึ่งเป็นเหตุผลที่นี้ควรเป็นวิธีการตัวอย่าง) ระบุtoString()เป็น OK Objectเนื่องจากวิธีการที่จะได้รับมรดกอยู่แล้วจาก วิธีการchars()และcodePoints()ปรับให้เข้าCharSequenceกับStreamส่วนต่อประสาน CharSequenceเพราะสิ่งเหล่านี้เป็นวิธีเริ่มต้นพวกเขาไม่ได้กำหนดความต้องการที่เพิ่มขึ้นสำหรับการดำเนินการในชั้นเรียน

CharSequenceประเภทจะเป็นประโยชน์เมื่อวิธีการที่จำเป็นต้องมีแหล่งที่มาของตัวละครทั่วไปโดยไม่ได้ระบุการดำเนินการโดยเฉพาะ (เช่น String กับ CharBuffer กับ StringBuilder) String#join()และString#contains()วิธีการเป็นตัวอย่างที่ดีของการใช้CharSequences

ไม่จำเป็นต้องCharSequenceจัดเตรียมcontains()วิธีการเนื่องจากสามารถนำไปใช้ภายนอกได้ ในขณะที่ Java ไม่มีความสะดวกสบายของวิธีการขยาย C # วิธีแบบคงที่เป็นหลักสิ่งเดียวกัน ดังนั้นแทนที่จะboolean Editable#contains(CharSequence needle)เป็นstatic boolean contains(CharSequence haystack, CharSequence needle)คุณ อัลกอริธึมการค้นหาสตริงเป็นหัวข้อวิทยาศาสตร์คอมพิวเตอร์ที่ได้รับการศึกษาเป็นอย่างดี อัลกอริทึมที่แตกต่างกับการแลกเปลี่ยนที่แตกต่างกันจะพร้อมใช้งาน

อ่านเพิ่มเติม:


2
คุณพูดถึง " อินเตอร์เฟซนี้ไม่ได้ให้การจัดการสตริงใด ๆ หรือวิธีการค้นหา. เหล่านี้จะออกจากขอบเขต. " แต่containsไม่ได้เป็นวิธีการกลายพันธุ์และมีไม่วิธีการที่มีอยู่การค้นหา ( charAt) ดังนั้นวิธีนี้จะใช้ ?. นอกจากนี้ " เนื่องจากสิ่งเหล่านี้เป็นวิธีการเริ่มต้นจึงไม่ได้กำหนดข้อกำหนดเพิ่มเติมสำหรับคลาสที่ใช้ CharSequence " - ไม่containsสามารถใช้เป็นค่าเริ่มต้นผ่านทาง impl return to String().contains(...)ลบข้อกำหนดสำหรับคลาสที่จะใช้งานได้หรือไม่
Vince Emigh

1
@VinceEmigh ใช่contains()อาจเป็นวิธีการเริ่มต้น ถ้ามันมีอยู่ก็ไม่ควรนำมาใช้ในแง่ของString#containsแต่วิธีอื่น ๆ รอบ: สตริงควรใช้การใช้งาน CharSequence charAt()ที่แตกต่างกัน มันไม่ได้ใช้อัลกอริธึมการค้นหามันเป็นส่วนสำคัญของCharSequence: หากไม่มีเนื้อหาที่ไม่สามารถคัดลอกเป็นประเภทStringอื่นได้ ลำธารเป็นส่วนหนึ่งที่สำคัญของ Java8 และการเพิ่มวิธีการเริ่มต้นเหล่านี้อยู่ในสายที่มีการเพิ่มเติมในการเชื่อมต่ออื่น ๆ Collectionเช่น
amon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.