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 หรือไม่ แต่บริบทโดยรวมอาจยังคงมีประโยชน์สำหรับคุณ
