Prawdziwym powodem jest to, że jest to problem spuścizny. Na System.in,out,err
stałe były częścią Java 1.0 ... i pewnie dużo dalej wstecz. Gdy stało się jasne, że projekt ma problemy, było już za późno, aby go naprawić. Najlepsze, co mogli zrobić, to dodać System.setIn,setOut,setErr
metody w Javie 1.1, a następnie rozwiązać problemy ze specyfikacją języka 1 .
Jest to podobne do pytania, dlaczego istnieje System.arraycopy
metoda statyczna , której nazwa narusza konwencje nazewnictwa Java.
Jeśli chodzi o to, czy jest to „zły projekt”, czy nie, myślę, że tak. Są sytuacje, w których obecna obsługa bez OO stanowi poważny problem. (Pomyśl ... jak możesz uruchomić jeden program Java w innym, gdy konflikt wymagań jego standardowego strumienia we / wy. Pomyśl ... kod testu jednostkowego, który pociąga za sobą zmianę strumieni.)
Mogę jednak również odnieść się do argumentu, że obecny sposób robienia rzeczy jest wygodniejszy w wielu przypadkach.
1 - Warto zauważyć, że System.in,out,err
zmienne są szczególnie wymieniane w JLS jako mające „specjalną semantykę”. JLS mówi, że jeśli zmienisz wartość final
pola, zachowanie jest niezdefiniowane ... z wyjątkiem tych pól.