Почему функция nullPrintStream () в java / lang / System сравнивает currentTimeMillis () с нулем? - PullRequest
10 голосов
/ 18 января 2012

При загрузке класса System метод <clinit> создает переменные in, out и err PrintStream в null, используя метод nullPrintStream():

private static PrintStream nullPrintStream() throws NullPointerException {
    if (currentTimeMillis() > 0) {
        return null;
    }
    throw new NullPointerException();
}

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

Почему он сравнивает currentTimeMillis() с 0? В каком случае это сравнение когда-нибудь вернет false?

1 Ответ

6 голосов
/ 18 января 2012

Javadoc для метода nullPrintStream () дает подсказку:

Однако компилятору нельзя разрешить встроенный доступ к ним, так как они позже устанавливаются в более разумные значения с помощью initializeSystemClass ().

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

currentTimeMillis () никогда не будет меньше 0. Но компилятор не настолько умен, чтобы это знать, и поэтому оставляет условное выражение без изменений.

...