CharSequence
= antarmuka
String
= implementasi konkret
Kamu berkata:
mengkonversi dari satu ke yang lain
Tidak ada konversi dari String
.
- Setiap
String
objek adalah a CharSequence
.
- Setiap
CharSequence
dapat menghasilkan a String
. Panggil CharSequence::toString
. Jika CharSequence
kebetulan menjadi String
, maka metode mengembalikan referensi ke objeknya sendiri.
Dengan kata lain, setiap String
adalah a CharSequence
, tetapi tidak setiap CharSequence
adalah a String
.
Pemrograman ke antarmuka
Pemrograman dalam Android, sebagian besar nilai teks diharapkan di CharSequence.
Mengapa demikian? Apa manfaatnya, dan apa dampak utama menggunakan CharSequence over String?
Secara umum, pemrograman ke antarmuka lebih baik daripada pemrograman ke kelas konkret. Ini menghasilkan fleksibilitas, sehingga kami dapat beralih di antara implementasi konkret antarmuka tertentu tanpa melanggar kode lainnya.
Saat mengembangkan API untuk digunakan oleh berbagai programer dalam berbagai situasi, tulis kode Anda untuk memberi dan mengambil antarmuka yang paling umum. Ini memberi programmer panggilan kebebasan untuk menggunakan berbagai implementasi dari antarmuka itu, implementasi mana yang terbaik untuk konteks khusus mereka.
Misalnya, lihat Java Collections Framework . Jika API Anda memberi atau mengambil koleksi memerintahkan objek, menyatakan metode Anda sebagai menggunakan List
bukan ArrayList
, LinkedList
, atau implementasi pihak ke-3 lainnya List
.
Saat menulis metode kecil cepat-dan-kotor untuk hanya digunakan oleh kode Anda di satu tempat tertentu, bukan menulis API yang akan digunakan di banyak tempat, Anda tidak perlu repot-repot menggunakan antarmuka yang lebih umum daripada beton khusus kelas. Tetapi meskipun begitu, tidak ada salahnya menggunakan antarmuka paling umum yang Anda bisa.
Apa perbedaan utama, dan masalah apa yang diharapkan, saat menggunakannya,
- Dengan
String
Anda tahu Anda memiliki satu bagian teks, seluruhnya dalam memori, dan tidak berubah.
- Dengan
CharSequence
, Anda tidak tahu apa fitur khusus dari implementasi konkret mungkin.
The CharSequence
objek mungkin mewakili potongan besar teks, dan karena itu memiliki implikasi memori. Atau mungkin banyak potongan teks yang dilacak secara terpisah yang perlu dijahit bersama saat Anda menelepon toString
, dan karenanya memiliki masalah kinerja. Implementasinya bahkan dapat mengambil teks dari layanan jarak jauh, dan karenanya memiliki implikasi latensi.
dan mengkonversi dari satu ke yang lain?
Anda biasanya tidak akan mengkonversi bolak-balik. A String
adalah a CharSequence
. Jika metode Anda menyatakan bahwa dibutuhkan CharSequence
, pemrogram pemanggil dapat melewatkan String
objek, atau mungkin melewatkan sesuatu yang lain seperti a StringBuffer
atau StringBuilder
. Kode metode Anda hanya akan menggunakan apa pun yang diteruskan, memanggil salah satu CharSequence
metode.
Yang paling dekat dengan konversi Anda adalah jika kode Anda menerima CharSequence
dan Anda tahu Anda perlu String
. Mungkin Anda berinteraksi dengan kode lama yang ditulis ke String
kelas daripada ditulis ke CharSequence
antarmuka. Atau mungkin kode Anda akan bekerja secara intensif dengan teks, seperti mengulang berulang kali atau menganalisis. Dalam hal ini, Anda hanya ingin mengambil satu kemungkinan performa yang dicapai hanya sekali, jadi Anda menelepon terlebih dahulu toString
. Kemudian lanjutkan dengan pekerjaan Anda menggunakan apa yang Anda tahu sebagai satu bagian teks yang seluruhnya ada dalam memori.
Sejarah bengkok
Perhatikan komentar yang dibuat pada Jawaban yang diterima . The CharSequence
antarmuka itu dipasang ke struktur kelas yang ada, jadi ada beberapa kehalusan penting ( equals()
& hashCode()
). Perhatikan berbagai versi Java (1, 2, 4 & 5) yang ditandai pada kelas / antarmuka — cukup banyak churn selama bertahun-tahun. Idealnya CharSequence
sudah ada sejak awal, tetapi itulah kehidupan.
Diagram kelas saya di bawah ini dapat membantu Anda melihat gambaran besar tipe string di Java 7/8. Saya tidak yakin apakah semua ini ada di Android, tetapi konteks keseluruhan masih terbukti bermanfaat bagi Anda.