Я думаю, что не обязательно, чтобы Java создавала какую-либо конструкцию, похожую на что-либо еще, даже на C ++. Все, что принято, должно быть так, потому что разработчики принимают это. Кроме того, аргументы типа «они сделали его похожим на что-то другое» не объясняют, почему они не просто делают версию метода экземпляра, они делают это с помощью примитивных оболочек (в дополнение к методу toString () экземпляра, они имеют статическую версию ).
Вот что я думаю:
В нормальном случае обе формы эквивалентны, но предположим, что у нас есть что-то вроде:
String invalidFormat = "%invalid"; // or something else that is invalid
и тогда мы звоним:
String.format(invalidFormat, anything);
// "anything" is indeed anything....
недопустимый становится аргументом, и Java проясняет это, бросая экземпляр IllegalArgumentException (даже в случае с Formatter, существует много видов).
Однако в чем-то вроде:
invalidFormat.format(anything);
неверный аргумент больше не является аргументом. Теперь проблема заключается в экземпляре, к которому он вызывается, и поэтому, вероятно, лучше описать его как «недопустимое состояние» (а не в «IllegalStateException» Java, который имеет совершенно другое использование). Но поскольку строки неизменяемы, это так называемое «состояние» никогда не изменится, поэтому оно всегда будет оставаться недопустимым как формат, даже если это допустимая простая строка.
Сравните это, скажем, с java.lang.Long. Обе версии toString никогда не вызовут никаких исключений, поэтому они обе эквивалентны.