Я смотрел на чей-то код и видел, что он неоднократно объявлял
PrintStream out = System.out;
и позже названный
out.println("blah");
Я на самом деле думал, что это было довольно аккуратно. Действительно ли это - обычная практика? Он просто был необычен?
Это разумный подход. По сути, он создает псевдоним для System.out
. Есть ряд преимуществ:
Это может быть связано с тем, что в общем случае не рекомендуется копаться и использовать объекты, которые являются членами других объектов. Это выглядит так, будто кто-то тянется к вашему карману, чтобы вытащить деньги из вашего бумажника, вместо того, чтобы просить вас одолжить ему немного денег.
У этого может быть небольшое преимущество, заключающееся в возможности изменить выходной поток, если это необходимо, на файл, сокет или что-то еще. Таким образом, он сможет заменить:
PrintStream out = System.out;
на
PrintStream out = new PrintStream(new FileOutputStream(filename));
. Однако, если он неоднократно заявляет об этом снова и снова, он действительно теряет указанное выше преимущество, потому что весь смысл в том, чтобы иметь его где-то централизованно и решать, где выводить журналы в одном месте.
Обратите внимание, что это очень грубый способ, и реальная стандартная практика - использовать ведение журнала. У Java есть собственный пакет java.util.logging из коробки, log4j - еще одна очень мощная альтернатива (и очень популярная), есть и другие.
Нет. Никогда раньше такого не видел.
Согласен. Не так уж и плохо ...
Это ярлык, если вы делаете много println.
Я видел, как это делали в некоторых местах и раньше, хотя обычно не делаю этого, потому что считаю System.out.println
более понятным, поскольку вам не нужно выяснять, где
был назначен. Я установил шаблон eclipse, чтобы я мог автоматически заполнить println
до System.out.println
, и это довольно быстро.
Если вы посмотрите на Throwable.printStackTrace в документации, вы можете вызвать его без аргументов, и он просто передаст System.out в версию, которая принимает PrintStream.
Довольно часто встречаются ситуации, когда можно передать несколько различных объектов PrintStream, и это значительно упрощает код печати.
Это милый трюк, но, как и большинство милых трюков, лучше просто сделать все правильно.
Как только вы дойдете до точки, где вы уверены, что вам нужен журнал (достаточно уверены, чтобы добавить что-то подобное), почему бы просто не купить Log4J или другую систему журнала, которая обладает еще большей гибкостью и мощностью?
Сглаживание - это мило и весело, если вы один, но даже если вы очень медленно печатаете и это экономит вам целых 5 секунд каждый раз, когда вы набираете это (по сравнению с System.out или "sysout +
в eclipse/netbeans), вы потеряете это время в десять раз, когда кто-то - возможно, вы - впервые увидит "out." и не сразу поймет, что это значит.
То есть, в одной программе, допустим, вы сделали то, что предложил кто-то другой, и перенаправили "out" в файл вместо STDOUT, но в некоторых классах, возможно, "out" все еще идет в System.out. или вы просто забыли, что перенаправили его в файл. Позже вы приходите и говорите: "Ну, тут написано:
out.println("WE MADE IT");
но я не вижу этой строки в STDOUT, что за черт?"
Потом вы тратите 4 часа на отслеживание плохого указания вместо того, чтобы исправить ошибку.
поскольку System.out
является final
переменной, то его действия будут идентичны ссылке на System.out
] напрямую.
, если кто-то не вызвал System.setOut ()
, который переназначил System.out
.
подождите, что?
Чтобы не набирать 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;
}
Является ли это хорошей идеей, является спорным и, вероятно, зависит от обстоятельств.
С другой стороны:
С минусовой стороны:
out
является переменной экземпляра или должна быть передана в качестве параметра. System.setOut()
. Следует отметить, что потенциально существуют и другие способы сделать это; Например, замена System.out.println(String)
служебным методом printLine(String)
обеспечивает аналогичный эффект без перекрестной связи.