Подтвердить что ты не робот

Почему неудобный дизайн System.out?

У кого-нибудь появилась идея относительно мотивации неудобного дизайна java.lang.System.out?

Неловкость:
Во-первых, выдается член (Encapsulation any?).
Во-вторых, это final, но может быть изменено с помощью setOut() (противоречит окончательному).

4b9b3361

Ответ 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().

Неужели это было сделано по историческим причинам? Есть ли еще такие языки?