Большинство ответов связаны с неизменностью - почему объект типа 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)