CharSequence
= интерфейс
String
= конкретная реализация
Вы сказали:
преобразование из одного в другое
Там нет конвертации из String
.
- Каждый
String
объект являетсяCharSequence
.
- Каждый
CharSequence
может изготовить String
. Вызов CharSequence::toString
. Если CharSequence
случаем является a String
, то метод возвращает ссылку на свой собственный объект.
Другими словами, каждый String
является CharSequence
, но не каждый CharSequence
является String
.
Программирование на интерфейс
При программировании на Android большинство текстовых значений ожидаются в CharSequence.
Это почему? В чем выгода и каковы основные последствия использования CharSequence вместо String?
Как правило, программирование для интерфейса лучше, чем программирование для конкретных классов. Это обеспечивает гибкость, поэтому мы можем переключаться между конкретными реализациями определенного интерфейса, не нарушая другой код.
При разработке API который будет использоваться различными программистами в различных ситуациях, напишите свой код, чтобы предоставить и использовать самые общие возможные интерфейсы. Это дает вызывающему программисту свободу использовать различные реализации этого интерфейса, независимо от того, какая реализация лучше всего подходит для их конкретного контекста.
Например, посмотрите на Java Collections Framework . Если API дает или принимает упорядоченную коллекцию объектов, объявлять методы, используя List
вместо ArrayList
, LinkedList
или любой другой реализации третьей стороной в List
.
При написании быстрого и грязного метода, который будет использоваться только вашим кодом в одном конкретном месте, в отличие от написания API, который будет использоваться в нескольких местах, вам не нужно беспокоиться об использовании более общего интерфейса, а не конкретного конкретного учебный класс. Но даже тогда было бы больно использовать самый общий интерфейс, какой только можно.
Каковы основные различия и какие проблемы ожидаются при их использовании,
- С помощью
String
вы знаете, что у вас есть один фрагмент текста, полностью в памяти, и является неизменным.
- С a
CharSequence
вы не знаете, какими могут быть конкретные особенности конкретной реализации.
CharSequence
Объект может представлять собой огромный кусок текста, и , следовательно , имеет значение памяти. Или может быть много фрагментов текста, отслеживаемых отдельно, которые нужно будет сшивать вместе, когда вы звоните toString
, и поэтому возникают проблемы с производительностью. Реализация может даже извлекать текст из удаленной службы, и, следовательно, имеет значение задержки.
и конвертировать из одного в другой?
Как правило, вы не будете конвертировать туда и обратно. String
ЯвляетсяCharSequence
. Если ваш метод объявляет, что он принимает a CharSequence
, вызывающий программист может передать String
объект или передать что-то еще, например, StringBuffer
или StringBuilder
. Код вашего метода будет просто использовать все, что передано, вызывая любой из CharSequence
методов.
Самое близкое, что вы получили бы к конвертации, это если ваш код получит, CharSequence
и вы знаете, что вам нужно String
. Возможно, вы взаимодействуете со старым кодом, написанным для String
класса, а не для CharSequence
интерфейса. Или, возможно, ваш код будет интенсивно работать с текстом, например, многократно повторять циклы или иным образом анализировать. В этом случае вы хотите получить любой возможный удар по производительности только один раз, так что вы звоните toString
прямо. Затем приступайте к работе, используя то, что, как вы знаете, представляет собой один фрагмент текста полностью в памяти.
Искаженная история
Обратите внимание на комментарии к принятому ответу . CharSequence
Интерфейс был переоборудован на существующих структуры класса, так что есть некоторые важные тонкости ( equals()
& hashCode()
). Обратите внимание на различные версии Java (1, 2, 4 и 5), помеченные на классах / интерфейсах - с течением времени они немного изменились. В идеале CharSequence
было бы на месте с самого начала, но такова жизнь.
Моя диаграмма классов ниже может помочь вам увидеть общую картину типов строк в Java 7/8. Я не уверен, что все это присутствует в Android, но общий контекст может оказаться полезным для вас.