Почему формат Строки (Возразите … args), определенный как статический метод?

на CoCalc вы можете загрузить свой файл ipynb и сотрудничать с другими в режиме реального времени. Существует также способ публикации файлов в виде статических HTML-файлов, но вы также можете приглашать своих членов команды в свой проект и работать над файлом, пока они наблюдают за тем, что происходит. Существует также чат-чат, чтобы говорить о содержании.

24
задан dlamblin 27 April 2009 в 05:10
поделиться

12 ответов

Perhaps "%02d".format(5) seems to imply that the object on which the format method is being called is a format string.

In this case, the format string happens to also be a String, so furthering that point, one could argue that all Strings are format strings.

Probably this can be avoided by saying that a static method in the String class can be used to format a string, rather than making some implicit statement about all Strings in general.

11
ответ дан 29 November 2019 в 00:04
поделиться

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

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

0
ответ дан harto 29 November 2019 в 00:04
поделиться

«% 02d» .format (5) будет выглядеть так, как будто «% 02d» отформатирован с использованием формата 5, а не наоборот. Также большинство строк не подходят в качестве формата («hello world» .format (5)?), Поэтому метод должен выдавать исключения для большинства строковых объектов.

3
ответ дан ggf31416 29 November 2019 в 00:04
поделиться

Хотя я не являюсь разработчиком Java, я могу сказать вам одну ясную причину для того, чтобы сделать его статичным.

В Java 5 было много функций, но две из них были следующими:

  • Возможность выполнять команды «импорта статических», которые позволяли использовать статические методы из класса легко и без перечисления имя их класса.
  • Статический служебный метод, который легко выполняет printfs.

Хотя было бы неплохо иметь возможность сказать "bla: %d".format("foo"),, сделав метод статичным, вы можете использовать форматирование таким способом, который очень знаком и понятен программистам на С, которые привыкли к printf().

import static java.lang.String.format;

public class Demo {

   public void Test() {

      //Do some stuff

      format("Hey, this is easy to read!");

   }
 }

И вот почему! Используя статический импорт, printfs выглядят почти так же, как в C. Awesome!

7
ответ дан Brandon Yarbrough 29 November 2019 в 00:04
поделиться

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

-1
ответ дан 29 November 2019 в 00:04
поделиться

Я думаю, что не обязательно, чтобы 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 никогда не вызовут никаких исключений, поэтому они оба эквивалентны.

даже если это допустимая простая строка.

Сравните это, скажем, с java.lang.Long. Обе версии toString никогда не вызовут никаких исключений, поэтому они оба эквивалентны.

даже если это допустимая простая строка.

Сравните это, скажем, с java.lang.Long. Обе версии toString никогда не вызовут никаких исключений, поэтому они оба эквивалентны.

0
ответ дан 29 November 2019 в 00:04
поделиться

Probably because String is immutable and therefore this method has to create and return a new instance of String instance. If the method was not declared static, you would probably expect it to modify the String instance on which it has been called.

0
ответ дан 29 November 2019 в 00:04
поделиться

Merely because the call is reminiscent of C's sprintf function.

0
ответ дан 29 November 2019 в 00:04
поделиться

Ответ лежит на методе Format.

Более логично и интуитивно понятно, по крайней мере для меня, сказать, что «строка формата является входом для метода Format», чем сказать, что « Формат работает с форматной строкой ". Это так, поскольку мы «обычно» передаем форматированную строку, известную во время разработки, в Format. Напротив, для Trim мы «обычно» передаем переменную строку, значение которой неизвестно во время разработки.

Итак, делая метод форматирования статическим, сделайте чтение кода более интуитивным. Посмотрите на следующее (C #).

answer = String.Format("This is format string : {0}", someValue); 
//More readable to me

answer = "This is format string : {0}".Format(someValue);

РЕДАКТИРОВАТЬ: Несмотря на то, что я использовал пример кода C #, это хорошо относится к Java. Я получил -ve голос за использование синтаксиса C #!

3
ответ дан 29 November 2019 в 00:04
поделиться

The main reason is probably that the designers of Java did not want to add too much stuff to the interface of String. Making it a member function would have meant putting it on string. Remember that a non-static method would have to be on the String object.

A second reason is that the static format maintains its resemblance to C's printf, which looks like printf(FORMAT, ARG1, ARG2...)

Another reason is that format is overloaded: there is a version that takes locale as the first parameter (before the string), so doing this on the string object would be tricky.

5
ответ дан 29 November 2019 в 00:04
поделиться

Вызов strfmt.format (objects) вместо String.format (strfmt, objects)

  • вместо этого является объектно-ориентированным вызовом вызова статического помощника.
  • его короче, чтобы напечатать.
  • его проще, поскольку у него меньше аргумента.
  • его проще использовать с дополнением кода. Если вы начнете с отформатировать строку и нажать. вы получаете format () в качестве опции в IDE.
  • String.format (strfmt, objects) может быть случайно вызван как strfmt.format (текст, объекты), который не будет делать то, что кажется.
0
ответ дан 29 November 2019 в 00:04
поделиться

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

  • Python:
     2.6: Печать «% s»% («Hello») 
     3.0: Печать («{0}». Формат («Hello»)) 
  • SCALA:
     2.7.6: PrintLN («% s» .Format («Hello»)) 
2
ответ дан 29 November 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: