Printf был добавлен в Java с выпуском 1.5, но я не могу найти, как отправить вывод в строку, а не в файл (что делает sprintf в C). Кто-нибудь знает как это сделать?
источник
Printf был добавлен в Java с выпуском 1.5, но я не могу найти, как отправить вывод в строку, а не в файл (что делает sprintf в C). Кто-нибудь знает как это сделать?
Строки являются неизменяемыми типами. Вы не можете изменять их, только возвращать новые экземпляры строк.
Из-за этого форматирование с помощью метода экземпляра не имеет большого смысла, так как его нужно вызывать так:
String formatted = "%s: %s".format(key, value);
Первоначальные авторы Java (и авторы .NET) решили, что статический метод имеет больше смысла в этой ситуации, поскольку вы не изменяете цель, а вместо этого вызываете метод форматирования и передаете входную строку.
Вот пример того, почему format()
был бы глуп как метод экземпляра. В .NET (и, вероятно, в Java), Replace()
это метод экземпляра.
Ты можешь сделать это:
"I Like Wine".Replace("Wine","Beer");
Однако ничего не происходит, потому что строки неизменяемы. Replace()
пытается вернуть новую строку, но она ничего не назначается.
Это вызывает много распространенных ошибок новичка, таких как:
inputText.Replace(" ", "%20");
Опять же, ничего не происходит, вместо этого вы должны сделать:
inputText = inputText.Replace(" ","%20");
Теперь, если вы понимаете, что строки неизменны, это имеет смысл. Если вы этого не сделаете, то вы просто запутались. Правильное место для Replace()
будет где format()
, как статический метод String
:
inputText = String.Replace(inputText, " ", "%20");
Теперь нет никаких сомнений относительно того, что происходит.
Реальный вопрос заключается в том, почему авторы этих платформ решили, что один должен быть методом экземпляра, а другой - статичным? На мой взгляд, оба более элегантно выражены как статические методы.
Независимо от вашего мнения, правда заключается в том, что вы менее склонны совершать ошибки, используя статическую версию, а код легче понять (без скрытых ошибок).
Конечно, есть некоторые методы, которые идеально подходят как методы экземпляра, возьмите String.Length ()
int length = "123".Length();
В этой ситуации очевидно, что мы не пытаемся изменить «123», мы просто проверяем его и возвращаем его длину. Это идеальный кандидат для метода экземпляра.
Мои простые правила для методов экземпляров на неизменяемых объектах:
Оба решения работают для имитации printf, но по-разному. Например, чтобы преобразовать значение в шестнадцатеричную строку, у вас есть 2 следующих решения:
с
format()
, ближайший кsprintf()
:с
replace(char oldchar , char newchar)
, немного быстрее, но довольно ограничено:Существует третье решение, состоящее в том, чтобы просто добавлять символ
ret
один за другим (символы - это числа, которые дополняют друг друга !), Например:... но это было бы действительно ужасно
источник
Вы можете сделать printf для всего, что является OutputStream с PrintStream. Как-то так, печать в поток строки:
Поток строки может быть создан как этот ByteArrayOutputStream:
источник