Comments 9
Все так, но то речь про String, а собственная реализация CharSequence действительно может делать и view оригинального объекта (если вдруг по каким-то причинам это принципиально в рамках проекта).
Что касается примера в статье в интерфейсе DefaultCharSequence — там идет сначала преобразование в String.
public String(char value[], int offset, int count) {
...
this.value = Arrays.copyOfRange(value, offset, offset+count);
}
Как-то даже стыдно, ни разу не сталкивался с подобным. Видимо, всё время везло
1) Неизменности обьекта
2) сравнения по контенту
Этого со строками можео добиться меньшими усилиями.
Мне представляется, это порочный путь — брать сложный контракт (interface) и неявно предпологать, что только его часть будет реально использоваться. Разве Вашему классу ClientId нужно имплементировать charAt()?
Здесь скорее речь про математический скаляр как отображение один-к-одному ClientId<->String. И скаляр как одномерная величина в противовес вектору (многомерный). Классические примеры скаляров — числовые и строковые типы.
Имплементация charAt() — это часть имплементации интерфейса CharSequence и именно этот факт дает возможность использовать объект как строку. Конкретно нужен не метод, но реализовать интерфейс частично не выйдет. Если например кидать в реализации charAt() UnsupportedOperationException, то некоторое строковое api будет вылетать, к примеру Pattern.matcher(cliendId).
Тем не менее, я с интересом прочитал вашу статью. Спасибо.
С моей точки зрения скаляр в математике указывает на отсутствие внутренней структуры объекта. Из скаляров строятся вектора и более сложные математические структуры.
Суть CharSequence, с моей точки зрения — это представление сложных символьных обьектов как вектора символов. Поэтому скаляр здесь не очень уместен.
Вот если бы Вы строку заменили бы на её хэш…
Магия CharSequence