2012-01-18 5 views
10

Quando si carica la classe System, il metodo <clinit> un'istanza della variabili in, out e errPrintStream al null utilizzando il metodo nullPrintStream():Perché il nullPrintStream() in java/lang/sistema Confronta currentTimeMillis() a zero?

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

capisco perché questo è il caso, e perché le variabili non posso essere istanziati durante caricamento, ma quello che mi confonde è il contenuto di quel metodo.

Perché è confrontando currentTimeMillis()-0? In tal caso, il confronto restituirà mai false?

+2

Se si viaggia indietro nel tempo per 31/12/1969 :-) –

risposta

6

Il Javadoc per il metodo nullPrintStream() dà un indizio:

Il compilatore, però, non può essere permesso di l'accesso in linea a loro, dal momento che sono in seguito impostati su valori più sensibili da initializeSystemClass ().

Questo è un hack di codifica, credo, per impedire al compilatore di inserire una semplice implementazione "return null".

currentTimeMillis() non potrà mai essere inferiore a 0. Ma il compilatore non è abbastanza intelligente per sapere che, e quindi lascia intatto l'istruzione condizionale.

+2

'per evitare che il compilatore da inlining un semplice "ritorno nulli" implementation.' per cui si vorrebbe impedire che? Semmai ha più senso per me un controllo di sanità mentale. – ArtB

+2

Ulteriori code-diving mostrano che un metodo nativo imposta i valori dei campi su valori più sensibili e non nulli successivamente. Ma il compilatore non sa che il codice nativo interferirà con i campi di java.lang.System. È hacky, disordinato e probabilmente una reliquia. –

+0

A @ RTB, se il compilatore inline un valore 'null' non era possibile utilizzare' System.out' e che sarebbe male. ;) –

Problemi correlati