2009-04-23 4 views
15

La classe java.lang.System definisce un numero di well-known properties.Perché Java non ha costanti per nomi di proprietà di sistema noti?

Ad esempio, è possibile ottenere la directory temporanea della JVM, cercando il "java.io.tmpdir" proprietà:

... = System.getProperty("java.io.tmpdir"); 

Quello che non capisco è il motivo per cui queste proprietà non sono definiti come costanti (ad es. nella classe java.lang.System). Questo sarebbe molto meno suscettibile di errori rispetto all'utilizzo di stringhe letterali. In altre parole, vorrei essere in grado di farlo:

... = System.getProperty(System.JAVA_IO_TMPDIR); 

Qualche idea del perché non è stato fatto? Potrebbe anche essere aggiunto in una versione futura di Java senza compromettere la compatibilità con le versioni precedenti. O mi manca qualcosa di ovvio?

+2

Quello che ho fatto è di crearlo da solo. Ci vogliono circa 30 secondi o giù di lì. my.package.SystemProperties e aggiungere le costanti lì. E poi lascia che il mio IDE mi aiuti da lì. – OscarRyz

+2

> Quello che ho fatto è crate (sic) il mio. E non hai fatto errori di battitura? :-) Questo illustra esattamente perché Sun avrebbe dovuto farlo una volta invece di lasciare a ciascun singolo sviluppatore. Le persone sono umane e sbagliano. –

+0

No, 0 errori di battitura. Li copio incollandoli e aggiungo solo quei valori che uso (che di solito sono solo intorno ai 4) :-) – OscarRyz

risposta

9

Tutte le proprietà documentate in System.getProperties() sono standardizzate - ogni implementazione Java SE deve fornirle. Non c'è ragione per cui Java 7 non possa introdurre costanti per questi nomi di proprietà standard. Non impedirebbe l'introduzione di nuove proprietà. Penso che nessuno abbia pensato che valesse la pena (anche le aggiunte banali alle API Java core devono passare attraverso i processi che penso).

9

La mia ipotesi è che Sun non volesse impegnarsi in un insieme predefinito di proprietà di sistema. Se non sono definiti come contant, possono aggiungere proprietà di sistema in qualsiasi momento (anche se rilasciano solo una versione incrementale di JDK come dalla 1.4.1 alla 1.4.2).

Edit:
Qualsiasi costanti predefinite devono essere considerati parte della API. Quindi anche la modifica del numero di costanti è una modifica dell'API. Non definendo alcuna costante, Sun può definire nuove proprietà di sistema senza introdurre una modifica API.

+1

+1 Sicuramente. – OscarRyz

+0

Non capisco il tuo ragionamento qui; l'utilizzo delle costanti per i nomi delle proprietà non impedisce l'aggiunta di nuove proprietà. In ogni caso, è molto più semplice e meno rischioso aggiungere una costante piuttosto che implementare la funzione rappresentata dalla costante, quindi non so perché non farebbero entrambe le cose contemporaneamente. Ad esempio, è molto meno utile aggiungere una riga che definisce la costante System.JAVA_IO_TMPDIR piuttosto che implementare la funzione in base alla quale una JVM può conoscere la propria directory temporanea. –

+1

@Andrew: Perché in questo modo il codice sorgente di java.lang.System è totalmente disaccoppiato dai valori di proprietà/chiave del sistema host. – OscarRyz

-5

Qual è la differenza tra uno "literal" e uno LITERAL?

Due caratteri: " e ".

Impossibile vedere perché preoccuparsi di inventare un set complesso di "literal" se "literal" funziona altrettanto bene.

+12

La differenza è che il compilatore può dirti se c'è un errore di battitura in LITERAL ma non se c'è un errore di battitura in "litteral". – jmucchiello

+4

Inoltre, l'IDE può eseguire il completamento automatico in modo da non dover creare prima un piccolo programma per stampare i valori e quindi copiare/incollare il risultato nel codice. – OscarRyz

+6

Perché preferirei trovare gli errori in fase di compilazione piuttosto che in fase di esecuzione! –

1

Per completezza, Apache Commons Lang ha la classe SystemUtils che fornisce costanti comuni e metodi predefiniti.

Questo esiste da diversi anni e ci sono buone probabilità che stiate già usando la lingua comune (2 o 3).

SystemUtils.getUserHome(); 
SystemUtils.getJavaIoTmpDir(); 
SystemUtils.JAVA_IO_TMPDIR; 
SystemUtils.USER_HOME;