Различия между StringBuilder
и StringBuffer
в Java хорошо документированы и были также touched upon in StackOverflow.Почему бы не создать StringBuilder и StringBuffer общий интерфейс?
В принципе, StringBuilder
является несинхронизированной копией StringBuffer
, с почти таким же интерфейсом, поскольку она была предназначена для более быстрой замены на StringBuffer
. Их API практически идентичен, и они фактически являются подклассами того же недоступным абстрактным классом в текущем JDK.
Единственное, о чем я спрашиваю, поэтому, почему они не являются публично связанными. Наличие обоих классов реализует общий интерфейс или даже имеет StringBuffer
в качестве подкласса StringBuilder
, что бы иметь смысл, позволяя существование общего кода для обоих классов.
Итак, почему это принудительное разделение? Это было так, что программисты не могли бы случайно смешать потокобезопасность с помощью небезопасного кода? Или это был просто надзор за дизайном, который теперь будет унаследован до конца вечности?
EDIT:
Чтобы сделать вещи ясно: я могу спекулировать о том, почему вещи, как это, но я надеюсь на конкретные ссылки на фактическое решение, например, во время процесса JSR. Все, что могло бы пролить свет на то, что для меня представляет собой ситуацию, которая иногда вызывает определенную трудность.
EDIT 2:
Тот факт, что оба класса реализации Appendable
полностью запамятовал. Вероятно, потому что этот конкретный интерфейс бесполезен для большинства целей - он может только добавить один символ или подготовленный объект, и все. В большинстве случаев это не более полезно, чем оба класса являются подклассами Object
.
EDIT 3:
Ну, вот обоснование именно этот вопрос от a semi-official source:
Оценки команды библиотек:
Это дизайн, что StringBuffer и StringBuilder доля нет общий публичный супертип. Они не предназначены для альтернатив: одна - ошибка (StringBuffer), а другая (StringBuilder) - ее замена .
Очевидно, что отсутствие общего супертипа может в некоторых случаях замедлить переход от StringBuffer к StringBuilder с ожидаемым переносом. Оборотная сторона заключается в том, что добавив общий супертип, мы будем принимать ошибки нашего прошлого и закреплять их в открытом интерфейсе, чтобы быть с нами для всех времени. Это не просто замедляет миграцию: это сводит на нет ее.
Существуют способы, например. append (long), которые находятся в обоих классах, но ни один из интерфейсов. –
Хотя я думаю, что как Vector и ArrayList расширяют AbstractList, StringBuffer и StringBuilder могли бы расширить аналогичный абстрактный класс. Я не смотрел на самый последний источник, но StringBuilder, похоже, был прямым тиражом StringBuffer за вычетом синхронизации. –
@MatthewFlaschen append() из Appendable. –