Почему формат String (Object ... args) определяется как статический метод? - PullRequest
22 голосов
/ 27 апреля 2009

Интересно, почему Java 5 и выше предоставляют форматтер в стиле printf с использованием статического метода в классе String, например:

public static String format(String format, Object... args)

вместо

public String format(Object... args)

, чтобы мы могли написать "%02d".format(5), чтобы получить 05 вместо String.format("%02d", 5).

Я подумал, что если бы я мог изменить класс String, я мог бы добавить это:

public String format(Object... args) {
    return format(this, args)
}

чтобы получить тот же результат.

Я обнаружил, что в C # вместо метода экземпляра также используется статический метод.

Интересно, почему они решили это сделать, но я не пришел к объяснению. Методы экземпляра trim и substring возвращают новый экземпляр строки, поэтому они должны были сделать то же самое с format.

Кроме того, класс DateFormat также использует это:

public final String format(Date date)

для форматирования дат. Поэтому, если мы рассмотрим экземпляр DateFormat в качестве средства форматирования, экземпляр String также можно будет использовать в качестве средства форматирования.

Есть идеи?

Ответы [ 14 ]

0 голосов
/ 27 апреля 2009

Возможно, потому что String является неизменным, и поэтому этот метод должен создать и вернуть новый экземпляр экземпляра String. Если метод не был объявлен как статический, вы, вероятно, ожидаете, что он изменит экземпляр String, для которого он был вызван.

0 голосов
/ 27 апреля 2009

Просто потому, что вызов напоминает функцию C sprintf.

0 голосов
/ 27 апреля 2009

В C # строки неизменны . Я думаю, что это верно и для Java (не уверен на 100%). Таким образом, вы не изменяете строку, вызывая для нее метод форматирования, вы только возвращаете новую строку с форматированием. Это делает его методом уровня класса, а не методом уровня экземпляра, поэтому он является статическим. Вы можете добавить фасад уровня экземпляра в C #, используя функцию расширения, но это просто синтаксический сахар поверх статической функции.

0 голосов
/ 27 апреля 2009

Возможно показать, что это «полезная» функция, которая существует для удобства, но на самом деле не является встроенной функцией String. То есть String "%02d" - это способ представления формата, но на самом деле он не выполняет никакого форматирования.

Метод существует для удобного форматирования строк, но Форматер (который выполняет фактическое форматирование) также может форматировать другие типы объектов (дата и т. Д.).

...