На system.out необходимо разъяснение

Я смотрел на чей-то код и видел, что он неоднократно объявлял

PrintStream out = System.out;

и позже названный

out.println("blah");

Я на самом деле думал, что это было довольно аккуратно. Действительно ли это - обычная практика? Он просто был необычен?

7
задан James Raitsev 7 November 2011 в 17:10
поделиться

9 ответов

Это разумный подход. По сути, он создает псевдоним для System.out . Есть ряд преимуществ:

  • Меньше набора текста.
  • Позже проще изменить код для вывода на другой PrintStream.
  • Возможно улучшение производительности, хотя оно будет незначительным.
7
ответ дан 6 December 2019 в 23:01
поделиться

Это может быть связано с тем, что в общем случае не рекомендуется копаться и использовать объекты, которые являются членами других объектов. Это выглядит так, будто кто-то тянется к вашему карману, чтобы вытащить деньги из вашего бумажника, вместо того, чтобы просить вас одолжить ему немного денег.

У этого может быть небольшое преимущество, заключающееся в возможности изменить выходной поток, если это необходимо, на файл, сокет или что-то еще. Таким образом, он сможет заменить:

PrintStream out = System.out;

на

PrintStream out = new PrintStream(new FileOutputStream(filename));

. Однако, если он неоднократно заявляет об этом снова и снова, он действительно теряет указанное выше преимущество, потому что весь смысл в том, чтобы иметь его где-то централизованно и решать, где выводить журналы в одном месте.

Обратите внимание, что это очень грубый способ, и реальная стандартная практика - использовать ведение журнала. У Java есть собственный пакет java.util.logging из коробки, log4j - еще одна очень мощная альтернатива (и очень популярная), есть и другие.

1
ответ дан 6 December 2019 в 23:01
поделиться

Нет. Никогда раньше такого не видел.

Согласен. Не так уж и плохо ...

0
ответ дан 6 December 2019 в 23:01
поделиться

Это ярлык, если вы делаете много println. Я видел, как это делали в некоторых местах и ​​раньше, хотя обычно не делаю этого, потому что считаю System.out.println более понятным, поскольку вам не нужно выяснять, где был назначен. Я установил шаблон eclipse, чтобы я мог автоматически заполнить println до System.out.println , и это довольно быстро.

0
ответ дан 6 December 2019 в 23:01
поделиться

Если вы посмотрите на Throwable.printStackTrace в документации, вы можете вызвать его без аргументов, и он просто передаст System.out в версию, которая принимает PrintStream.

Довольно часто встречаются ситуации, когда можно передать несколько различных объектов PrintStream, и это значительно упрощает код печати.

0
ответ дан 6 December 2019 в 23:01
поделиться

Это милый трюк, но, как и большинство милых трюков, лучше просто сделать все правильно.

Как только вы дойдете до точки, где вы уверены, что вам нужен журнал (достаточно уверены, чтобы добавить что-то подобное), почему бы просто не купить Log4J или другую систему журнала, которая обладает еще большей гибкостью и мощностью?

Сглаживание - это мило и весело, если вы один, но даже если вы очень медленно печатаете и это экономит вам целых 5 секунд каждый раз, когда вы набираете это (по сравнению с System.out или "sysout +" в eclipse/netbeans), вы потеряете это время в десять раз, когда кто-то - возможно, вы - впервые увидит "out." и не сразу поймет, что это значит.

То есть, в одной программе, допустим, вы сделали то, что предложил кто-то другой, и перенаправили "out" в файл вместо STDOUT, но в некоторых классах, возможно, "out" все еще идет в System.out. или вы просто забыли, что перенаправили его в файл. Позже вы приходите и говорите: "Ну, тут написано:

out.println("WE MADE IT");

но я не вижу этой строки в STDOUT, что за черт?"

Потом вы тратите 4 часа на отслеживание плохого указания вместо того, чтобы исправить ошибку.

0
ответ дан 6 December 2019 в 23:01
поделиться

поскольку System.out является final переменной, то его действия будут идентичны ссылке на System.out ] напрямую.

, если кто-то не вызвал System.setOut () , который переназначил System.out .

подождите, что?

0
ответ дан 6 December 2019 в 23:01
поделиться

Чтобы не набирать System.out.println специально при выполнении небольшого теста (без IDE), я использую import static java.lang.System.out ] вместо

Но это может иметь смысл, если вы хотите позже заменить значение System.out , возможно, на оболочку для перенаправления в файл

 PrintStream out = new FilePrintStream("MyLogs.log"); // // System.out

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

Кстати, лучше также объявить его как final и static:

class YourClass  {
    private final static PrintStream out = System.out;
}
3
ответ дан 6 December 2019 в 23:01
поделиться

Является ли это хорошей идеей, является спорным и, вероятно, зависит от обстоятельств.

С другой стороны:

  • Это делает код приложения более аккуратным.
  • Это может упростить изменение назначения для вывода.

С минусовой стороны:

  • Это потенциально увеличивает перекрестную связь; например, если переменная out является переменной экземпляра или должна быть передана в качестве параметра.
  • Это может вызвать проблемы, если приложению потребуется вызвать System.setOut().
  • Если код System.out просто отлаживается, это затрудняет его замечание и удаление. Действительно, это, вероятно, сводит на нет PMD (и т.д.) проверки качества кода, которые сообщают о таких вещих.

Следует отметить, что потенциально существуют и другие способы сделать это; Например, замена System.out.println(String) служебным методом printLine(String) обеспечивает аналогичный эффект без перекрестной связи.

0
ответ дан 6 December 2019 в 23:01
поделиться
Другие вопросы по тегам:

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