Указание javac игнорировать System.out.println ()

1

Я использую System.out.println() (sout) для отладки и общих целей общего обзора во время программирования (что особенно полезно для сетевого материала). Так как я хочу, чтобы мой код был эффективным в конце, есть ли способ сказать компилятору java игнорировать souts?

Я уже пробовал некоторые поисковые системы, но решения, которые очень неудовлетворительны, например, положить все souts внутри if с глобальной переменной. (Тройная линия и код очень нечитабельны, если требуется много секвенсов)

Кто-нибудь знает, существует ли такой параметр компилятора (если нет, почему бы и нет?), Или если есть другое более элегантное решение, то указанное выше. Спасибо за ответ :)

  • 13
    В общем, вы должны использовать каркас журналирования, а не System.out.println() . Это дает вам гораздо более детальный контроль и, в некоторых средах, позволяет избежать потери производительности и памяти при конкатенации строк для неиспользуемых операторов журнала.
  • 0
    Этот ответ, вероятно, не то, что вы ищете, но вы можете написать свою собственную функцию println , а затем, когда вы компилируете ее по-настоящему, вы просто делаете ее пустой.
Показать ещё 3 комментария
Теги:
javac

2 ответа

4
Лучший ответ

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

Logger.getLogger(getClass().getName()).log(Level.FINE, "...");

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

Альтернативный способ - использовать модульные тесты и не выводить в производственный код. Это требует большей строгости и позволяет находить ошибки регрессии.

И третьей альтернативой было бы более либерально использовать (непроверенные) исключения, IllegalArgumentException, IllegalStateException. Быть информативным.

3

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

Но если вы намерены использовать System.out, вы все равно можете добиться желаемого эффекта. В нижележащем классе я меняю System.out (используя метод System.setOut) на другой PrintStream, который на самом деле ничего не печатает.

import java.io.*;

    class Sys
    {
        public static void main ( String [ ] args ){
        System.setOut(new PrintStream(new OutputStream(){
            @Override
                public void write(int b){
            }
            }));
        System.out.println("Hello World!");
        }
    }

Мой ответ можно улучшить. Например, он все равно будет преобразовывать объекты в строку для печати, но вы можете решить эту проблему, указав на переопределенный класс PrintStream, который абсолютно ничего не делает.

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

  • 0
    +1 как раз то, что задал вопрос. Может проверить, будет ли args[i] быть «подробным» флагом, а затем не делать setOut .
  • 0
    Этот тоже получил мой голос; Правильный API ведения журналов - лучший архитектурный проект, но на самом деле это отвечает на вопрос, заданный в контексте использования System.out для ведения журналов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню