На system.out требуется уточнение - PullRequest
7 голосов
/ 15 июня 2010

Я просматривал чей-то код и увидел, что он неоднократно заявлял

PrintStream out = System.out;

и позже называется

out.println("blah");

Я на самом деле думал, что это было здорово. Это обычная практика? Был ли он просто фантазии?

Ответы [ 9 ]

7 голосов
/ 15 июня 2010

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

  • Меньше печатать.
  • Позже изменить код для вывода на другой PrintStream.
  • Возможно улучшение производительности, хотя оно будет незначительным.
3 голосов
/ 15 июня 2010

Чтобы не вводить 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;
}
1 голос
/ 15 июня 2010

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

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

PrintStream out = System.out;

на

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

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

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

0 голосов
/ 15 июня 2010

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

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

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

0 голосов
/ 15 июня 2010

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

С положительной стороны:

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

На минусовой стороне:

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

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

0 голосов
/ 15 июня 2010

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

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

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

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

out.println("WE MADE IT");

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

Затем вы проводите 4 часа, отслеживаянеправильная индикация вместо исправления ошибки.

0 голосов
/ 15 июня 2010

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

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

0 голосов
/ 15 июня 2010

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

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

0 голосов
/ 15 июня 2010

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

...