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, але загальний контекст може все-таки виявитися корисним для вас.
