2009-04-23 15 views
15

La clase java.lang.System define un número de well-known properties.¿Por qué Java no tiene constantes para nombres de propiedades de sistemas bien conocidos?

Por ejemplo, se puede obtener el directorio temporal de la JVM por buscar la propiedad "java.io.tmpdir":

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

Lo que no entiendo es por qué estas propiedades no están definidas como constantes (por ejemplo, en la clase java.lang.System). Esto sería mucho menos propenso a errores que el uso de cadenas literales. En otras palabras, me gustaría poder hacer esto:

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

¿Alguna idea de por qué no se hizo esto? Incluso podría agregarse en una versión futura de Java sin romper la compatibilidad hacia atrás. ¿O me estoy perdiendo algo obvio?

+2

Lo que he hecho es crear el mío. Tarda unos 30 segundos más o menos. my.package.SystemProperties y agrega las constantes allí. Y luego deje que mi IDE me ayude desde allí. – OscarRyz

+2

> Lo que he hecho es hacer cray (sic) el mío. ¿Y no cometió errores tipográficos? :-) Esto ilustra exactamente por qué Sun debería haber hecho esto una vez en lugar de dejarlo en manos de cada desarrollador individual. La gente es humana y comete errores. –

+0

No, 0 errores tipográficos. Copio pegarlos y solo agrego esos valores que uso (que generalmente son solo 4) :-) – OscarRyz

Respuesta

9

Todas las propiedades documentadas en System.getProperties() están estandarizadas; cada implementación de Java SE debe proporcionarlas. No hay ninguna razón para que Java 7 no pueda introducir constantes para estos nombres de propiedad estándar. No evitaría la introducción de nuevas propiedades. Creo que nadie más ha pensado que vale la pena el esfuerzo (incluso las adiciones triviales a las API centrales de Java tienen que pasar por los procesos, creo).

9

Supongo que Sun no quería comprometerse con un conjunto predefinido de propiedades del sistema. Si no están definidos como contantes, pueden agregar propiedades del sistema en cualquier momento (incluso si solo lanzan una versión incremental del JDK como desde 1.4.1 a 1.4.2).

Editar:
Cualquier constantes predefinidas deben ser considerados parte de la API. Por lo tanto, incluso cambiar la cantidad de constantes es un cambio de API. Al no definir constantes, Sun puede definir nuevas propiedades del sistema sin introducir un cambio de API.

+1

+1 Definitivamente. – OscarRyz

+0

No entiendo tu razonamiento aquí; el uso de constantes para los nombres de las propiedades no detendría la adición de nuevas propiedades. En cualquier caso, es mucho más fácil y menos arriesgado agregar una constante que implementar la característica que representa la constante, por lo que no sé por qué no harían ambas cosas al mismo tiempo. Por ejemplo, es mucho menos trabajo agregar una línea que defina la constante System.JAVA_IO_TMPDIR que implementar la característica mediante la cual una JVM puede conocer su propio directorio temporal. –

+1

@Andrew: Porque de esa manera el código fuente de java.lang.System está totalmente desacoplado de la propiedad/valores clave que tiene el sistema host. – OscarRyz

-5

¿Cuál es la diferencia entre un "literal" y un LITERAL?

Dos caracteres: " y ".

No puedo ver por qué molestarse en inventar un conjunto complejo de LITERAL s cuando "literal" funciona igual de bien.

+12

La diferencia es que el compilador puede decirle si hay un error tipográfico en LITERAL pero no si hay un error tipográfico en "litteral". – jmucchiello

+4

Además, el IDE puede autocompletarse, por lo que no es necesario crear primero un programa pequeño para imprimir los valores y luego copiar/pegar el resultado en el código. – OscarRyz

+6

¡Porque preferiría encontrar errores en tiempo de compilación que en tiempo de ejecución! –

1

Para completar, Apache Commons lang tiene la clase SystemUtils que proporciona constantes comunes y métodos predefinidos.

Esto existe desde hace varios años y es probable que ya esté usando commons lang (2 o 3).

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