Pregunta

Estaba buscando en el código de otra y vio que él declaró en repetidas ocasiones

PrintStream out = System.out;

y, más tarde llamado

out.println("blah");

De hecho, me pareció que era una especie de limpia. ¿Es esta una práctica común? Se acaba de ser lujoso?

¿Fue útil?

Solución

Este es un enfoque razonable. Él está creando básicamente un alias para System.out. Hay una serie de ventajas:

  • Menos escribir.
  • más fácil cambiar más tarde el código para la salida a un PrintStream diferente.
  • Es posible una mejora del rendimiento, aunque será insignificante.

Otros consejos

Para evitar System.out.println mecanografía especialmente cuando se realiza pequeña prueba (sin un IDE) Puedo utilizar import static java.lang.System.out lugar

Pero eso puede tener sentido si desea sustituir el valor de System.out más tarde, tal vez a una envoltura para redirigir a un archivo

 PrintStream out = new FilePrintStream("MyLogs.log"); // // System.out

y silenciar la salida estándar a la vez. Lo repito puede tiene sentido en algunos escenarios, porque para esto yo usaría un marco de registro.

Por cierto, sería mejor declarar como final y estática también:

class YourClass  {
    private final static PrintStream out = System.out;
}

Puede ser que sea porque en general no se recomienda para ahondar en los objetos de uso y que son miembros de otros objetos. Se ve como alguien que alcanza para su bolsillo para obtener su dinero de su billetera en lugar de pedirle que le preste algo de dinero.

Es posible que exista una ligera ventaja a esto lo que habría de ser capaz de cambiar la corriente de salida si es necesario a un archivo, el casquillo o lo que sea. Por lo que sería capaz de reemplazar:

PrintStream out = System.out;

con

PrintStream out = new PrintStream(new FileOutputStream(filename));

Sin embargo, si está declarando repetidamente una y otra vez que realmente está perdiendo la ventaja anterior, porque el objetivo sería tener algún lugar centralizado y decidir dónde dar salida a los registros en un solo lugar.

Tenga en cuenta que esta es una manera muy cruda y la práctica estándar real es con el uso de la tala. Java tiene su propio paquete java.util.logging fuera de la caja, log4j es otra alternativa muy potente (y muy popular) y hay otros.

Es un acceso directo, si está haciendo una gran cantidad de println. que he visto hacer en los lugares antes, aunque no tienden a hacerlo porque creo System.out.println es clara ya que no tiene que averiguar dónde estaba out asignado. I fijó una plantilla de Eclipse así que puede autocompletar println a System.out.println y es bastante rápido.

Nop. Nunca había visto eso antes.

Estoy de acuerdo. No es nada mal ...

Si nos fijamos en Throwable.printStackTrace en la documentación se le puede llamar sin argumentos, y que sólo pasa System.out a la versión que tiene un PrintStream.

Es muy común encontrar situaciones en las que un número de diferentes objetos PrintStream podría pasar alrededor y hace que la impresión de códigos mucho más simple.

Es un truco lindo, pero al igual que la mayoría de los trucos lindo podría ser mejor sólo para hacerlo bien.

Una vez que llegue al punto en que está seguro de que desea el registro (lo suficientemente seguro de agregar algo así), ¿por qué no acaba de obtener Log4J o algún otro sistema de registro que tiene una mayor flexibilidad y poder?

Aliasing material es una especie de mono y divertido si estás solo, pero incluso si usted es un mecanógrafo muy lento y que un conjunto 5 segundos ahorra cada vez que el usuario escribe (sobre System.out o "sysout +<ctrl-space>" en Eclipse / NetBeans) , perderá ese tiempo diez veces la primera vez que alguien - posiblemente - ve "fuera". y no sabe inmediatamente lo que significa.

Es decir, en un programa Digamos que usted hizo lo que algún otro cartel y sugirió redirigido "fuera" para ir a un archivo en lugar de STDOUT pero en algunas clases, tal vez "fuera" todavía va a System.out. o tal vez sólo se olvide que redirige a un archivo. Más tarde entras y dices "bueno, que dice:

out.println("WE MADE IT");

pero no veo esa línea en la salida estándar, ¿qué diablos? "

A continuación, usted pasa 4 horas el seguimiento de una mala indicación en lugar de corregir el error.

Si esto es una buena idea es discutible, y probablemente depende de las circunstancias.

En el lado positivo:

  • Esto hace que el aspecto más ordenado código de la aplicación.
  • Se puede simplificar el cambio de destino para la salida.

En el lado negativo:

  • Se aumenta potencialmente de acoplamiento cruzado; p.ej. si la variable out es una variable de instancia o tiene que ser pasado como parámetro.
  • Es potencialmente causa problemas si sus necesidades de aplicación a System.setOut() llamada.
  • Si el código System.out se acaba de depuración, esto hace que sea más difícil de aviso y quitar. De hecho, es probable que anula PMD (etc) los controles de calidad de código que reportan este tipo de cosas.

Debe tenerse en cuenta que hay potencialmente otras maneras de hacer esto; p.ej. reemplazando System.out.println(String) con un printLine(String) método de utilidad logra un efecto similar sin el acoplamiento cruzado.

desde System.out es una variable final, lo que hizo sería identitcal de referencia System.out directamente.

a menos que alguien llama System.setOut() cuales reasignado System.out.

Espera, ¿qué?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top