Boolean および Character ラッパー クラスが Serializable インターフェイスと Comparable インターフェイスを実装しているのはなぜですか? それの用途は何ですか?
4 に答える
このComparable
インターフェースはJava 5Boolean
のクラスに追加され、バグJDK-4329937および少なくとも 1 つのバグに対処しました。引用された問題の 1 つは、.JTable
当初、Joshua Blochからも反論がありました。
現在の設計は言語自体と一致しています。2 つのブール値の順序を比較しようとすると、コンパイル時にエラーが発生します。
if (true < false) // ERROR: WON'T COMPILE foo();
ラッパー クラス (ブール値) は、ラップされたプリミティブの動作をミラーリングするだけです。...
プラグマティズムの祭壇でこの「設計の純粋さ」を喜んで犠牲にしますが、ブール値を比較する必要があるとは確信していません。ブール値のリストをソートしたいことは非常にまれです。より一般的なのは、このフィールドに基づいて Boolean フィールドを含むオブジェクトのリストをソートすることですが、これを行うには Comparator を使用する必要があります。とにかく Comparator を作成している場合、Boolean 自体は Comparable を実装していませんが、Boolean フィールドに基づいてソートするのは簡単です。
しかし、数年後、有用性が認められました。
この機能を提供すれば、人々の生活が楽になることが何年にもわたって明らかになってきました。
この拡張機能が実装されてから、さらに便利になりました。たとえば、Java 8では、このクラスは、フィールドに基づいてコンパレーターを構築できるComparator
新しいメソッドcomparing()
および を導入しました。thenComparing
また、ソート基準の一部としてブール値フィールドを含めることは合理的で便利です。
それを含むオブジェクトをシリアル化できるように、Serializable を実装します。シリアライズ可能にしないと、深刻な制限になります。
Comparable は、可能な値が 2 つしかないためあまり役に立ちません。そのため、他のラッパーとの一貫性を保つために使用される可能性があります。
注:Void
はシリアライズ可能または同等ではありませんが、シリアライズ可能である場合のみ可能null
です。
ほとんどの Collection クラスでプリミティブを使用するには、Comparable を実装する必要があります。ラッパーがないと、順序付けされた Collection クラスでプリミティブを使用できませんでした。また、純粋なプリミティブであるため、equals メソッドがないため、キー ベースの Collection クラスは機能しません。
これが1つです。...でインスタンス化ArrayList<T>
してみてくださいboolean