@erickson.
Строки являются неизменяемыми типами. Вы не можете изменять их, только возвращать новые экземпляры строк.
Из-за этого "foo" .format () не имеет большого смысла, так как он должен быть вызван как
string newString = "foo".format();
Первоначальные авторы java (и авторы .NET) решили, что статический метод имеет больше смысла в этой ситуации, поскольку вы не изменяете "foo", а вместо этого вызываете метод форматирования и передаете входную строку.
РЕДАКТИРОВАТЬ : Хех, этот сайт иногда может быть настолько забавным. Меня опровергли за упоминание того факта, что строки являются неизменяемыми типами.
Вот пример того, почему Format () будет глупым как метод экземпляра. В .NET (и, вероятно, в Java) Replace () является методом экземпляра.
Вы можете сделать это:
"I Like Wine".Replace("Wine","Beer");
Однако ничего не происходит, потому что строки неизменны. Replace пытается вернуть новую строку, но ей ничего не назначено.
Это вызывает много распространенных ошибок новичка, таких как:
// Contrived Example
inputText.Replace(" ","%20");
Опять ничего не происходит, вместо этого вы должны сделать:
inputText = inputText.Replace(" ","%20");
Теперь, если вы понимаете, что строки неизменны, это имеет смысл. Если вы этого не сделаете, то вы просто запутались. Правильное место для Replace, где будет Format, как статический метод String:
inputText = String.Replace(inputText," ", "%20");
Теперь нет никаких сомнений относительно того, что происходит.
Реальный вопрос в том, почему авторы этих фреймворков решили, что один должен быть методом экземпляра, а другой - статическим? На мой взгляд, оба более элегантно выражены как статические методы, но Эриксон, кажется, считает, что оба принадлежат как методы экземпляра.
Независимо от вашего мнения, правда в том, что вы менее склонны ошибаться при использовании статической версии, а код легче понять (без скрытых ошибок).
Конечно, есть некоторые методы, которые идеально подходят в качестве методов экземпляра, возьмите String.Length ()
int length = "123".Length();
В этой ситуации очевидно, что мы не пытаемся изменить «123», мы просто проверяем его и возвращаем его длину ... Это идеальный кандидат для метода экземпляра.
Мои простые правила для методов экземпляров для неизменяемых объектов:
- Если вам нужно вернуть новый экземпляр того же типа, используйте статический метод.
- В противном случае используйте метод экземпляра.