2016-12-12 6 views
0

私の理解では、publicフィールドとfinalフィールドは事実上読み取り専用フィールドです。したがって、それを公開すると、java.lang.Integerの不変性には影響しません。java.lang.Integerがプライベート値フィールドを公開しないのはなぜですか?

intValue()で値にアクセスでき、JITがメソッド呼び出しを開始してインライン化すると、パフォーマンスは問題にならないはずです。しかし、一般に、にはpublic final int valueが含まれていないスレッドの理由などがありますか?

+0

私たちがプライベートであると定義できるとき、それはなぜフィールドの公開を定義しますか?実際にカプセル化に従わなければなりません。 – vahid

+0

フィールドを公開しないようにすることをお勧めします。 –

+0

'String、Byte、Character、Short、Long、Float、Double、そして実際には他のすべてのクラスが自分のプライベートフィールドを公開しないと考えることができるのと同じ理由で。 – EJP

答えて

0

スレッディングについてではなく、OOPです。 intは値タイプ、Integerはオブジェクトです。オブジェクト指向プログラミング(OOP)では、オブジェクトのフィールドを公開するのではなく、公開メソッド(別名getterおよびsetter)を作成する必要があります。

定数/読み込み専用のフィールドであっても、それは良い方法です。 カプセル化と考えてください。intValue()の方法を公開しても、その背後の実装(ここではバッキングフィールドvalue)が何らかの理由で変更された場合でも、チェック、検証などの追加ロジックを追加してもintの値を返すことができますelse。ご覧のとおり、バッキングフィールドは実装の詳細です。これはユーザーには表示しないでください。

0

Integer.java延伸Number.java抽象クラスです。抽象メソッドの1つは

public abstract int intValue(); 

です。抽象メソッドは、実装クラスが従わなければならない連絡先を定義します。したがって、Integer.javaはメソッドの実装を提供します。このメソッドが既に存在する場合は、フィールドを非表示にしてフィールドの値を取得するメソッドとしてintValue()を指定するだけです。どちらもアクセス可能であれば混乱する可能性があります。

もう1つの理由は、新しいバージョンのJavaが定期的に公開されるということです。言語開発者は下位互換性のために最善を尽くしています。今日はフィールドを使用していると思いますが、明日は値を返す前にいくつかの論理演算やチェックを行うことに決めました。今すぐ直接フィールドにアクセスできれば、達成するのは難しいでしょう。

関連する問題