2009-04-07 5 views
12

誰かがjava.lang.System.outの厄介なデザインの背後にある動機についてアイデアを持っていますか?なぜSystem.outの厄介なデザイン?

不器用:
まず、アウトメンバーは(カプセル化誰?)が露出されます。
第2に、の最終ですが、setOut()(最終的なものと矛盾します)で変更することができます。

+2

カプセル化は、「すべての変数を非公開または保護する」という意味ではありません。 –

+0

私は私のメンバーを私的に(最終的な静的なものを除いて)持っているのが好きですが、私は同意します。 –

+4

:)そこには冗談があります... – Varkhan

答えて

19

Java 1.0.x System.outでは、友人はfinalではなく、直接割り当てて変更することができました。しかし、これはSunがオプションでJava 1.1(この時点でアプレット用)でこの動作を制限することに決めたときに問題を提起しました。下位互換性を維持するために、outが最終決定され、ネイティブメソッドが作成され、適切なセキュリティチェックが適用されました。

+2

新しいJavaメモリモデルのSystem.in/out/errには特別な例外があります。 –

9

私は、主に簡潔にするために公開されていると思います。比較:

System.out.prinln("blah"); 

System.getOut().println("blah"); 

元に多くの文字より短くはありませんが、まだそれは概念的短く、かつ単純です。 JITがJava仮想マシンであまり一般的でない日にはおそらく、非常に高速です。私は直接アクセスがこれらの場合のメソッド呼び出しより高速であると確信しています。だから、それはトレードオフになる。

UPDATE:finalsetOut()については
documentation for the latterは、セキュリティマネージャが存在する場合、発信者が再設定された出力ストリームに許可されているかどうかを確認するために照会されることを言います。これは答えかもしれません。 outのメンバーが直接割り当て可能だった場合、それを保護する手段はありませんでした。

これはAPIの私の解釈であり、デザインの背後にあるかもしれない考えであり、私はオフになる可能性があります。

+0

なぜ、final&setOut()なのですか –

+0

System.out.printlnとSystem.outOut()。printlnのどちらを選択するのですか?なぜStdIo.printLn? –

+0

@Hermal、JavaはUnix社によって作成され、in/out/errは標準のUnix概念です。 –

2

これはArray.lengthList.size()との類似点を持っています。

歴史的な理由でこれを実行できましたか?このような他の言語はありますか?

+0

配列に対してsetLength()を使用することはできません。 –

+0

私はArray.lengthは、当初は配列がオブジェクトではないことを強調したかったからです(もちろんカプセル化されていない限り)。私が同意する以外、File.mkdir();誰でも? :) – Esko

+0

しかし配列AREオブジェクト、ちょうど "奇妙な"表記(Object obj = new int [4];) –

関連する問題