Почему класс String объявлен финальным в Java? - PullRequest
133 голосов
/ 15 января 2010

С тех пор, как я узнал, что класс java.lang.String объявлен как финальный в Java, мне стало интересно, почему это так. Тогда я не нашел никакого ответа, но этот пост: Как создать копию класса String в Java? напомнил мне о моем запросе.

Конечно, String предоставляет всю необходимую мне функциональность, и я никогда не думал о какой-либо операции, которая потребовала бы расширения класса String, но тем не менее вы никогда не узнаете, что кому-то может понадобиться!

Итак, кто-нибудь знает, каково было намерение дизайнеров, когда они решили сделать его окончательным?

Ответы [ 16 ]

1 голос
/ 10 декабря 2012

Окончательность строк также защищает их как стандарт. В C ++ вы можете создавать подклассы строки, поэтому у каждого магазина программирования может быть своя версия строки. Это привело бы к отсутствию строгих стандартов.

1 голос
/ 08 марта 2011

Чтобы убедиться, что мы не получим лучшую реализацию.Конечно, это должен был быть интерфейс.

[править] Ах, я получаю больше невежественных голосов.Ответ совершенно серьезен.Мне приходилось несколько раз программировать обход глупой реализации String, что приводило к серьезной потере производительности и производительности

1 голос
/ 08 декабря 2010

Ну, у меня несколько иное мнение, я не уверен, прав ли я или нет, но в Java String - единственный объект, который также можно рассматривать как примитивный тип данных. Я имею в виду, что мы можем создать объект String как * 1001. * String name = "java" . Теперь, как и другие примитивные типы данных, которые копируются по значению , а не копируются по ссылке String, как ожидается, будет иметь такое же поведение, поэтому String является окончательным. Вот о чем я думал. Пожалуйста, игнорируйте, если это совершенно нелогично.

0 голосов
/ 11 октября 2017

Большинство ответов связаны с неизменностью - почему объект типа String не может быть обновлен на месте. Здесь много хороших дискуссий, и сообществу Java было бы неплохо принять неизменность в качестве принципала. (Не затаив дыхание.)

Однако вопрос ОП заключается в том, почему он окончательный - почему он не может быть расширен. Некоторые здесь приняли это на себя, но я бы согласился с ФП, что здесь есть реальный пробел. Другие языки позволяют разработчикам создавать новые номинальные типы для типа. Например, в Haskell я могу создать следующие новые типы, которые во время выполнения идентичны тексту, но обеспечивают безопасность связывания во время компиляции.

newtype AccountCode = AccountCode Text
newtype FundCode = FundCode Text

Поэтому я бы выдвинул следующее предложение в качестве расширения языка Java:

newtype AccountCode of String;
newtype FundCode of String;

AccountCode acctCode = "099876";
FundCode fundCode = "099876";

acctCode.equals(fundCode);  // evaluates to false;
acctCode.toString().equals(fundCode.toString());  // evaluates to true;

acctCode=fundCode;  // compile error
getAccount(fundCode);  // compile error

(или, возможно, мы могли бы начать отлучаться от Java)

0 голосов
/ 09 февраля 2017

Знает ли JVM, что является неизменным? Ответ: Нет, постоянный пул содержит все неизменяемые поля, но все неизменяемые поля / объекты хранятся не только в постоянном пуле. Только мы реализуем его таким образом, чтобы он достиг неизменности и его особенностей. CustomString может быть реализован без окончательного использования MarkerInterface, который обеспечит специальное поведение Java для пула, эта функция все еще ожидается!

0 голосов
/ 24 февраля 2016

Если вы создадите строку один раз. Она будет считать, что это объект, если вы хотите изменить это, это невозможно, это создаст новый объект.

...