CharSequence
= อินเตอร์เฟส
String
= การนำไปปฏิบัติที่เป็นรูปธรรม
คุณพูดว่า:
แปลงจากที่หนึ่งไปยังอีก
String
ไม่มีการแปลงจาก
- ทุก
String
วัตถุเป็นCharSequence
- ทุกคนสามารถผลิต
CharSequence
String
โทรCharSequence::toString
. หากCharSequence
เกิดขึ้นเป็น a String
แล้ววิธีการส่งกลับการอ้างอิงไปยังวัตถุของตัวเอง
ในคำอื่น ๆ ทุกคนString
เป็นCharSequence
แต่ไม่ใช่ทุกคนCharSequence
เป็นString
เป็น
การเขียนโปรแกรมไปยังส่วนต่อประสาน
การเขียนโปรแกรมใน Android ค่าข้อความส่วนใหญ่คาดว่าเป็น CharSequence
ทำไมถึงเป็นอย่างนั้น? ประโยชน์คืออะไรและผลกระทบหลักของการใช้ CharSequence ผ่านสายอักขระคืออะไร
โดยทั่วไปการเขียนโปรแกรมไปยังอินเตอร์เฟสดีกว่าการเขียนโปรแกรมไปยังคลาสที่เป็นรูปธรรม สิ่งนี้ให้ความยืดหยุ่นดังนั้นเราจึงสามารถสลับระหว่างการใช้งานที่เป็นรูปธรรมของส่วนต่อประสานเฉพาะโดยไม่ทำให้รหัสอื่นแตกหัก
เมื่อพัฒนาAPIเพื่อให้โปรแกรมเมอร์ต่าง ๆ ใช้ในสถานการณ์ต่าง ๆ ให้เขียนโค้ดของคุณเพื่อมอบและใช้อินเทอร์เฟซทั่วไปที่เป็นไปได้ สิ่งนี้จะทำให้ผู้เรียกโปรแกรมเมอร์มีอิสระในการใช้การใช้งานที่หลากหลายของอินเทอร์เฟซนั้นการดำเนินการใดก็ตามที่ดีที่สุดสำหรับบริบทเฉพาะ
ยกตัวอย่างให้ดูที่Java คอลเลกชันกรอบ หาก API ของคุณให้หรือใช้เวลาคอลเลกชันที่สั่งซื้อของวัตถุประกาศวิธีการของคุณกับการใช้List
มากกว่าArrayList
, LinkedList
หรือใด ๆ การดำเนินการของบุคคลที่ 3 อื่น ๆ List
ของ
เมื่อเขียนวิธีเล็ก ๆ น้อย ๆ ที่รวดเร็วและสกปรกเพื่อใช้งานโดยรหัสของคุณในสถานที่หนึ่งโดยเฉพาะซึ่งต่างจากการเขียน API ที่จะใช้ในหลาย ๆ ที่คุณไม่จำเป็นต้องกังวลกับการใช้อินเทอร์เฟซทั่วไปมากกว่าคอนกรีตเฉพาะ ชั้น แต่ถึงอย่างนั้นการทำเช่นนี้จะเป็นการทำลายการใช้อินเทอร์เฟซทั่วไปที่คุณสามารถทำได้
อะไรคือความแตกต่างที่สำคัญและปัญหาที่คาดหวังขณะใช้งาน
- ด้วย
String
คุณรู้ว่าคุณมีชิ้นส่วนของข้อความทั้งหมดในหน่วยความจำและจะไม่เปลี่ยนรูป
- ด้วย
CharSequence
คุณไม่ทราบว่าคุณลักษณะเฉพาะของการใช้งานที่เป็นรูปธรรมอาจเป็นอย่างไร
CharSequence
วัตถุอาจเป็นตัวแทนอันมหาศาลของข้อความและดังนั้นจึงมีผลกระทบต่อหน่วยความจำ หรืออาจเป็นข้อความจำนวนมากที่ถูกติดตามแยกต่างหากซึ่งจะต้องประสานเข้าด้วยกันเมื่อคุณโทรtoString
ดังนั้นจึงมีปัญหาด้านประสิทธิภาพ การใช้งานอาจจะได้รับข้อความจากบริการระยะไกลและดังนั้นจึงมีความหมายแฝง
และแปลงจากที่หนึ่งไปยังอีกที่?
โดยทั่วไปคุณจะไม่แปลงไปมา String
เป็น CharSequence
หากวิธีการที่คุณบอกว่ามันต้องใช้CharSequence
โปรแกรมเมอร์โทรอาจผ่านString
วัตถุหรืออาจจะผ่านอะไรอย่างอื่นเช่นหรือStringBuffer
StringBuilder
รหัสของวิธีการของคุณจะใช้สิ่งใดก็ตามที่ผ่านไปแล้วเรียกใช้CharSequence
วิธีการใด ๆ
ที่อยู่ใกล้คุณจะได้รับการแปลงคือถ้ารหัสของคุณได้รับและคุณรู้ว่าคุณต้องมีCharSequence
String
บางทีคุณกำลังเชื่อมต่อกับรหัสเก่าที่เขียนไปยังString
คลาสแทนที่จะเขียนลงในCharSequence
อินเทอร์เฟซ หรือบางทีรหัสของคุณจะทำงานกับข้อความอย่างเข้มข้นเช่นวนซ้ำ ๆ หรือวิเคราะห์เป็นอย่างอื่น ในกรณีดังกล่าวคุณต้องการให้มีการแสดงที่เป็นไปได้เพียงครั้งเดียวดังนั้นคุณจึงต้องพูดคุยtoString
ล่วงหน้า จากนั้นดำเนินงานของคุณต่อโดยใช้สิ่งที่คุณรู้ว่าเป็นข้อความชิ้นเดียวในความทรงจำ
ประวัติบิดเบี้ยว
จดบันทึกความคิดเห็นที่ทำไว้ในคำตอบที่ยอมรับได้ CharSequence
อินเตอร์เฟซที่ได้รับการดัดแปลงโครงสร้างบนชั้นที่มีอยู่จึงมีบางรายละเอียดปลีกย่อยที่สำคัญ ( equals()
และhashCode()
) สังเกตุรุ่นต่างๆของ Java (1, 2, 4 & 5) ที่ติดแท็กในคลาส / อินเตอร์เฟส - ค่อนข้างปั่นป่วนตลอดหลายปีที่ผ่านมา CharSequence
คงจะเป็นการดีที่จะได้อยู่ในจุดเริ่มต้น แต่นั่นคือชีวิต
แผนภาพคลาสของฉันด้านล่างอาจช่วยให้คุณเห็นภาพขนาดใหญ่ของประเภทสตริงใน Java 7/8 ฉันไม่แน่ใจว่าสิ่งเหล่านี้มีอยู่ใน Android หรือไม่ แต่บริบทโดยรวมอาจยังคงมีประโยชน์สำหรับคุณ