Настоящая причина в том, что это проблема наследия. Эти System.in,out,err
константы были частью Java 1.0 ... и , вероятно, намного дальше. К тому времени, когда стало ясно, что у дизайна были проблемы, было слишком поздно, чтобы исправить это. Лучшее, что они могли сделать, - это добавить System.setIn,setOut,setErr
методы в Java 1.1, а затем заняться проблемами спецификации языка 1 .
Это похоже на проблему того, почему существует статический System.arraycopy
метод, имя которого нарушает соглашения об именах Java.
Что касается того, является ли это «плохим дизайном» или нет, я думаю, что это так. Существуют ситуации, когда текущая обработка без OO является серьезной проблемой. (Подумайте ... как вы можете запустить одну Java-программу внутри другой, когда их требования к стандартному потоку ввода-вывода вступают в противоречие. Подумайте ... код модульного тестирования, который влечет за собой изменение потоков.)
Тем не менее, я также могу сослаться на аргумент, что нынешний способ ведения дел во многих случаях более удобен .
1 - Интересно отметить, что System.in,out,err
переменные в JLS особо упоминаются как имеющие «особую семантику». JLS говорит, что если вы измените значение final
поля, поведение будет неопределенным ... за исключением случая с этими полями.