Почему неудобный дизайн System.out?
У кого-нибудь появилась идея относительно мотивации неудобного дизайна java.lang.System.out?
Неловкость:
Во-первых, выдается член (Encapsulation any?).
Во-вторых, это final, но может быть изменено с помощью setOut() (противоречит окончательному).
Ответы
Ответ 1
В Java 1.0.x System.out
и друзья не были final
- их можно было изменить, назначив им непосредственно. Однако это вызвало проблему, когда Sun решила опционально ограничить это поведение в Java 1.1 (для апплетов в то время). Чтобы поддерживать хотя бы некоторую обратную совместимость, out
был сделан окончательным и написан с помощью собственного метода, который был обернут соответствующими проверками безопасности.
Ответ 2
Я бы поспорил, что он представлен в основном для краткости. Для сравнения:
System.out.prinln("blah");
с
System.getOut().println("blah");
Первое не так много символов короче, но все же оно короче и проще концептуально. Это также очень вероятно быстрее, возможно, особенно в тот день, когда JIT не был слишком распространен в виртуальных машинах Java; Я уверен, что прямой доступ быстрее, чем вызов метода в этих случаях. Таким образом, это сводится к тому, чтобы быть компромиссом.
UPDATE:
Что касается final
и setOut()
, документация для последнего говорит, что если есть менеджер безопасности, он будет запрошен, чтобы увидеть если вызывающему абоненту разрешено повторно установить выходной поток. Это может быть ответ; если элемент out
был непосредственно назначен, не было бы способа защитить его.
Это только моя интерпретация API и мысли, которые могут быть за его дизайном, я мог бы отключиться.
Ответ 3
Это имеет сходство с Array.length
vs List.size()
.
Неужели это было сделано по историческим причинам? Есть ли еще такие языки?