Der wahre Grund dafür ist, dass dies ein altes Problem ist. Die System.in,out,err
Konstanten waren Teil von Java 1.0 ... und wahrscheinlich viel weiter zurück. Als klar war, dass das Design Probleme hatte, war es zu spät, um es zu beheben. Das Beste, was sie tun konnten, war, die System.setIn,setOut,setErr
Methoden in Java 1.1 hinzuzufügen und sich dann mit den Sprachspezifikationsproblemen 1 zu befassen .
Dies ähnelt der Frage, warum es eine statische System.arraycopy
Methode gibt, deren Name die Java-Namenskonventionen verletzt.
Ob dies "schlechtes Design" ist oder nicht, glaube ich. Es gibt Situationen, in denen die derzeitige Nicht-OO-Behandlung ein ernstes Problem darstellt. (Überlegen Sie, wie Sie ein Java-Programm in einem anderen ausführen können, wenn die "Standard-E / A" -Stream-Anforderungen kollidieren. Überlegen Sie, ob ... Unit-Test-Code die Streams ändert.)
Ich kann mich jedoch auch auf das Argument beziehen, dass die derzeitige Vorgehensweise in vielen Fällen praktischer ist.
1 - Es ist interessant zu bemerken, dass die System.in,out,err
Variablen in der JLS als "spezielle Semantik" besonders erwähnt werden. Das JLS sagt, dass, wenn Sie den Wert eines final
Feldes ändern , das Verhalten undefiniert ist ... außer im Fall dieser Felder.