sintaxis - java saber sistema operativo
La mejor práctica para usar las propiedades del sistema Java (7)
Como el título de la pregunta es extremadamente amplio, incluiré otra buena práctica que debe considerar al usar las propiedades del sistema. El acceso a las propiedades del sistema puede ser denegado por SecurityManager
, por lo que puede necesitar acceder a ellas a través de PrivilegedAction
, como esta:
String tmpdir = AccessController.doPrivileged(new PrivilegedAction<String>() {
public String run() {
return System.getProperty("java.io.tmpdir");
}
});
Utilice una acción privilegiada cuando su código restrinja una acción sensible para que sea segura incluso si el código malicioso la invoca.
Por ejemplo, no sería seguro usar una acción privilegiada en un método como OutputStream open(File file)
. El código no confiable podría invocarlo, y usar los privilegios de su código para escribir cualquier cosa, en cualquier lugar.
Sin embargo, si tuviera un método que guarde las preferencias del usuario para su aplicación en un archivo que elija, probablemente sea seguro. Un llamador malicioso no puede elegir la ubicación del archivo o su contenido; ésos son especificados por tu código. Por lo tanto, su método puede usar una acción privilegiada para permitir que sea invocado por un código sin privilegios.
Nuestro código usa muchas propiedades del sistema, por ejemplo, ''java.io.tmpdir'', ''user.home'', ''user.name'', etc. No tenemos constantes definidas para estos en cualquier lugar (y tampoco lo creo java) o cualquier otra cosa inteligente para tratar con ellos, por lo que están en texto sin formato en todo el código.
String tempFolderPath = System.getProperty("java.io.tmpdir");
¿Cómo está todo el mundo usando las propiedades del sistema?
Trataría esto como cualquier otra constante de cadena que haya esparcido por su código y definiría una variable constante para él. De acuerdo, en este caso es poco probable que "java.io.tmpdir" cambie, pero nunca se sabe. (No me refiero a que Sun pueda cambiar el significado de "java.io.tmpdir", ni a qué propiedad del sistema apunta, sino que puede cambiar de opinión acerca de qué propiedad del sistema necesita leer).
Si solo está utilizando una propiedad en particular dentro de una clase, entonces definiría las constantes en esa clase.
private final String TEMPDIR = "java.io.tmpdir";
Si está utilizando las mismas propiedades en diferentes clases, puede definir una clase propia estática para contener las constantes que usa con más frecuencia.
public final Class Prop {
public static final String TEMPDIR = "java.io.tmpdir";
...
}
Entonces, donde sea que necesites usar esa constante solo llámala usando
System.getProperty(Prop.TEMPDIR);
si lo está usando en varios lugares, puede ser una buena idea escribir una clase para encapsular la lectura de la propiedad y quizás otras propiedades.
entonces tal vez algo como: Configuration.getTemporaryDirectory ()
PROP_
estos como cualquier otra constante, probablemente con un prefijo P_
o PROP_
, y los pondría en una clase de constantes apropiadas.
Si usa muchos de ellos, incluso consideraría dividirlos en una clase de constantes de PropertyNames
:
public final class PropertyNames
{
private PropertyNames()
{
// no instantiation
}
public static final String P_VAR_DIRECTORY = "org.acme.app.varDir";
public static final String P_TMP_DIRECTORY = "java.io.tmpDir";
}
Finalmente, consideraría seriamente el nombre de los nombres de propiedad en el espacio de nombres, con el nombre de dominio inverso estándar utilizado para los paquetes. Esto es solo para evitar chocar con los consumidores de propiedades de terceros.
Creo que en un software orientado a objetos, probablemente tiene un objeto (o un método) que tiene una dependencia en un directorio donde se debe realizar un trabajo. Entonces, puedes poner en evidencia esta dependencia en el constructor o el método. Después de eso, si necesita un valor predeterminado para ese directorio y el valor predeterminado proviene de una propiedad del sistema, puede simplemente crear un método de fábrica o un constructor / método con menos parámetros que pasen al otro costrunctor / método a:
new File(System.getProperty("java.io.tmpdir");
No es necesario crear un "imán de dependencia" solo para contener un parámetro de configuración.
En Java, las cadenas son inmutables, lo que significa que el mismo objeto en el espacio de la memoria no se sobrescribe; una nueva Cadena se crea todo el tiempo. La sugerencia actualmente más votada es usar una constante:
System.getProperty(Prop.TEMPDIR);
Lamentablemente, la constante que se utiliza es para la clave de propiedad real. Eso significa que cada vez que realiza esta llamada, va a crear un nuevo objeto String para mantener el valor. En mi opinión, debe hacer que la constante sea el resultado de la llamada en sí:
public static final String SYS_PROP_TEMP_DIR = System.getProperty("java.io.tmpdir");
SystemUtils proporcionado por el paquete Apache Commons Lang, resuelve este problema.
SystemUtils ha definido una constante para la mayoría de las propiedades del sistema, que se puede obtener mediante una búsqueda, por ejemplo:
import org.apache.commons.lang3.SystemUtils;
class Something
{
public static void main(String[] args){
System.out.println(SystemUtils.JAVA_IO_TMPDIR);
}
}
Probablemente, esa es una forma más limpia de hacerlo.