Причина использования CharSequence в качестве параметра в методе замены String - PullRequest
3 голосов
/ 20 июня 2020

Есть ли логическое объяснение, почему некоторые методы в классе String имеют параметры с типом CharSequence, а другие - с типом String? Например:

public String replace(CharSequence target, CharSequence replacement)

и

public boolean startsWith(String prefix)

Почему метод replace не использует String для своих параметров, как это делает метод startWith?

Ответы [ 2 ]

5 голосов
/ 20 июня 2020

Есть ли логическое объяснение, почему некоторые методы в классе String имеют параметры с типом CharSequence, а другие - с типом String?

Краткий ответ: Обратная совместимость.

CharSequence был добавлен в Java 1.4.

replace(CharSequence target, CharSequence replacement) был добавлен в Java 1.5, поэтому он мог использовать уже существующий тип CharSequence.

startsWith(String prefix) существует с Java 1.0, поэтому он не мог использовать несуществующий тип CharSequence в то время и не мог 'не изменяться в Java 1.4 (или более поздних версиях), потому что это вызовет обратную совместимость проблемы.

Почему метод replace не использует String для своих параметров, как и метод startWith делает?

Таким образом, вы можете передавать другие типы объектов, которые реализуют CharSequence.

2 голосов
/ 20 июня 2020

CharSequence

Существует больше классов, чем просто String, которые реализуют читаемые последовательности символов, т.е. похожи на String.

Интерфейс CharSequence представляет их, см. Документацию :

A CharSequence - это читаемая последовательность char значений . Этот интерфейс обеспечивает унифицированный доступ только для чтения ко многим различным типам последовательностей символов. [...]

Известные на данный момент классы реализации: CharBuffer, Segment, String, StringBuffer, StringBuilder. Как видите, String - лишь один из них, их больше.

Модульность

Если ваш метод принимает CharSequence, тогда он гораздо более модульный, так как он также может принимать другие классы string-i sh.

Очевидно, что CharSequence немного ограничен в своих возможностях (проверьте предлагаемые методы). Таким образом, не все строковые методы могут быть выполнены на CharSequence. Иногда вам нужны дополнительные функции, которые предлагает String, тогда вы не можете работать с CharSequence.

Это очень базовая концепция c, во многом как некоторые вещи можно делать на Animal но другие, например bark(), могут быть выполнены только с Dog.

replace и startsWith

В вашем конкретном примере c причина на самом деле обратная совместимость .

Интерфейс CharSequence был добавлен в Java 1,4 , его не было с самого начала.

Однако startsWith, хотя теоретически он мог работать с CharSequence, был добавлен в Java 1.0 уже, где он еще не был доступен.

replace был добавлен с Java 1.5 , поэтому после CharSequence было что-то.

Из-за обратной совместимости , Java создатели не могут просто редактировать startsWith и использовать вместо него CharSequence. Он должен продолжать использовать String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...