2009-04-07 11 views
12

¿Alguien tiene una idea sobre la motivación detrás del diseño incómodo de java.lang.System.out?¿Por qué el diseño incómodo de System.out?

torpeza:
En primer lugar, el miembro se expone a cabo (encapsulación alguien?).
En segundo lugar, es final pero se puede cambiar a través de setOut() (contradice la final).

+2

La encapsulación no significa "hacer todas sus variables privadas o protegidas". –

+0

Acepto, aunque me gusta que mis miembros sean privados (excepto los estáticos finales). –

+4

:) Hay una broma allí ... – Varkhan

Respuesta

19

En Java 1.0.x System.out y sus amigos no eran final -era posible cambiarlos asignándoselos directamente. Sin embargo, esto presentó un problema cuando Sun decidió restringir opcionalmente este comportamiento en Java 1.1 (para applets, en ese momento). Para mantener al menos cierta compatibilidad con versiones anteriores, out se hizo final y se escribió con un método nativo, que se completó con las comprobaciones de seguridad apropiadas.

+2

Y tenía que haber una excepción específica para System.in/out/err para el nuevo Modelo de memoria Java. –

9

Apuesto a que está expuesto principalmente por brevedad. Compare:

System.out.prinln("blah"); 

con

System.getOut().println("blah"); 

El primero es que no muchos caracteres más corto, pero aún así es más corto y más simple conceptualmente. También es muy probable que sea más rápido, quizás especialmente en los días en que el JIT no era muy común en las máquinas virtuales Java; Apuesto a que el acceso directo es más rápido que una llamada a método en esos casos. Entonces, todo se reduce a ser una compensación.

ACTUALIZACIÓN:
En cuanto a final y setOut(), la documentation for the latter dice que si hay un controlador de seguridad, que se puede consultar para ver si se permite que la persona que llama para re-establecer el flujo de salida. Esta podría ser la respuesta; si el miembro out hubiera sido asignable directamente, no habría habido una forma de protegerlo.

Esto es solo mi interpretación de la API y los pensamientos que pueden estar detrás de su diseño, podría estar apagado.

+0

Ok, entonces ¿por qué final & setOut() –

+0

¿Por qué es la elección entre System.out.println y System.outOut(). Println? ¿Por qué no StdIo.printLn? –

+0

@Hermal, porque Java fue creado por una compañía Unix, y in/out/err son conceptos estándar de Unix. –

2

Esto tiene similitudes con Array.length vs List.size().

¿Se pudo haber hecho por razones históricas? ¿Hay otros idiomas como este?

+0

aunque no puede usar setLength() en una matriz. –

+0

Creo que Array.length es la forma en que es porque alguien originalmente quería destacar que las matrices no son objetos (a menos que estén encapsuladas, por supuesto). Aparte de eso estoy de acuerdo, File.mkdir(); ¿nadie? :) – Esko

+0

pero los arreglos SON objetos, solo una notación "extraña" (Object obj = new int [4];) –

Cuestiones relacionadas