CharSequence
= інтерфейс
String
= конкретна реалізація
Ти сказав:
перетворення від одного до іншого
Перетворення з String
.
- Кожен
String
об’єкт - це CharSequence
.
- Кожен
CharSequence
може виробляти String
. Дзвінок CharSequence::toString
. Якщо це CharSequence
станеться a String
, метод повертає посилання на власний об'єкт.
Іншими словами, кожен String
є a CharSequence
, але не кожен CharSequence
є a String
.
Програмування на інтерфейс
Програмування в Android, більшість текстових значень очікується в CharSequence.
Чому так? Яка вигода та які основні наслідки використання CharSequence над String?
Взагалі програмування на інтерфейс краще, ніж програмування на конкретні класи. Це дає гнучкість, тому ми можемо перемикатися між конкретними реалізаціями певного інтерфейсу, не порушуючи іншого коду.
Розробляючи API, який використовуватимуться різними програмістами в різних ситуаціях, напишіть свій код, щоб надати та взяти найбільш загальні можливі інтерфейси. Це дає програмісту, що викликає, свободу використовувати різні реалізації цього інтерфейсу, залежно від того, яка реалізація найкраща для їх конкретного контексту.
Наприклад, подивіться на Framework Collections Java . Якщо API дає або приймає впорядковану колекцію об'єктів, оголошувати методи, використовуючи List
замість ArrayList
, LinkedList
або будь-який інший реалізації третьою стороною в 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, але загальний контекст може все-таки виявитися корисним для вас.