2009-04-07 8 views
12

Czy ktoś wpadł na pomysł dotyczący motywacji stojącej za niezręczną konstrukcją pliku java.lang.System.out?Dlaczego niezręczny projekt System.out?

niezręczności:
pierwsze, się członkiem jest narażona (Encapsulation ktoś?).
Po drugie, jest to końcowy, ale można go zmienić za pomocą setOut() (sprzeczne z wersją ostateczną).

+2

Kapsułkowanie nie oznacza "zmień wszystkie zmienne jako prywatne lub chronione". –

+0

Zgadzam się, chociaż lubię mieć swoich członków jako prywatnych (z wyjątkiem ostatecznych statycznych). –

+4

:) Istnieje żart tam ... – Varkhan

Odpowiedz

19

W języku Java 1.0.x System.out i przyjaciółmi nie było final - można było je zmienić, przypisując je bezpośrednio. Jednak to stanowiło problem, gdy Sun zdecydował się opcjonalnie ograniczyć to zachowanie w Javie 1.1 (dla apletów, w tym czasie). Aby zachować przynajmniej pewną wsteczną zgodność, out została wykonana jako ostateczna i napisana przy użyciu natywnej metody, która została zapakowana z odpowiednimi kontrolami bezpieczeństwa.

+2

Musiał istnieć określony wyjątek dla System.in/out/err dla nowego modelu pamięci Java. –

9

Założę się, że jest narażony głównie na zwięzłość. Porównaj:

System.out.prinln("blah"); 

z

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

Była to postać nie wiele krótsze, ale nadal jest to krótsze i prostsze koncepcyjnie. Prawdopodobnie jest to również szybsze, być może szczególnie w dniu, w którym JIT nie było zbyt powszechne w wirtualnych maszynach Java; Założę się, że bezpośredni dostęp jest szybszy niż wywołanie metody w tych przypadkach. Sprowadza się to do kompromisu.

UPDATE:
chodzi o final i setOut() The documentation for the latter mówi, że jeśli nie jest menedżerem bezpieczeństwa, zostanie on zapytał, czy rozmówca może ponownie ustawić strumień wyjściowy. To może być odpowiedź; jeśli członek out został bezpośrednio przypisany, nie byłoby sposobu, aby go chronić.

To tylko moja interpretacja API i myśli, które mogą być za jego projektem, mógłbym odejść.

+0

Ok, więc dlaczego final i setOut() –

+0

Dlaczego jest wybór między System.out.println i System.outOut(). Println? Dlaczego nie StdIo.printLn? –

+0

@Hermal, ponieważ Java została stworzona przez firmę Unix, a in/out/err to standardowe koncepcje Uniksa. –

2

To ma podobieństwa z Array.length vs List.size().

Czy można to zrobić z przyczyn historycznych? Czy są jeszcze inne języki?

+0

, chociaż nie można użyć setLength() w tablicy. –

+0

Myślę, że Array.length jest taki, jaki jest, ponieważ ktoś pierwotnie chciał podkreślić, że tablice nie są obiektami (chyba że są hermetycznie zamknięte). Poza tym zgadzam się, File.mkdir(); ktoś? :) – Esko

+0

ale tablice SĄ obiektami, po prostu "dziwna" notacja (Object obj = new int [4];) –

Powiązane problemy