【第11条】Comprableインターフェースの実現を考える

1937 ワード

この章(前の3条)で論じられた方法と違って、compreTo方法はObjectでは声明されていません。java.lang.cmparableインターフェースの中で唯一の方法です。このインターフェースを実現するには、「固有の順序付け能力」があるとも言える。
   
    compreToの方法は比較的に等しいことを許可する以外に、大きさを比較することができます。通常x yは、x.com areTo(y)は正の整数を返します(通常は1)
 
    compreToはequalsと似た約束を持っています。
 1)自発性:x.com mpareTo(x)は必ずtrueである。 2)対称性:x.com mpare To(y)だけが0である場合。それではy.com areTo(x)も0でなければなりません。 3)伝達性:もしx.com mpareTo(y) == 0,sgn(x.com areTo(z) == sgn(y.com areTo(z) 成立しなければなりません(sgnは正負を取るために-1に戻ります。0;1)
                 x.com mpareTo(y)<0、y.com areTo(z)<0;X.com mpareTo(x)も必ず<0 4)整合性:任意の参照値xとyに対して、compreTo比較の対象情報が修正されていない場合、何度もX.com areTo(y)を呼び出して返した値は一致している。 5)強い提案:(x.com mpareTo(y)=0)=(x.equals(y))ですが、これは厳密な要求ではありません。一般的には、Commarableインターフェースを実現したクラスは、この条件に違反した場合、明確に説明するべきです。このような言い方をオススメします。「このクラスは固有の順序付け能力を持っていますが、equalsとは一致していません。」
 
    一つの例はBigDecimalです。この条件を満たしていないクラスです。2つのオブジェクトを実装します。new Big Decimal(1.0)とnew Big Decimal(1.00)は、この2つのオブジェクトをHashSetに入れると、HashSetは2つの要素があり、TreeSetに入れると、このTreeSetは1つの要素しかありません。なぜなら、HashSetはhashCodeとequalsによって判断されたからです。TreeSetは、compreToによって判断されます。詳細はBigDecimalの文書をご覧ください。
 
    compreToの用途は私達が直接使用できる以外に、多くのAPIが既に利用されています。内部の並べ替え能力(Comprableインターフェースを実現した)を持つ対象を提供すればいいです。例えば、上記の例のTreeSetです。たとえば、配列の要素があるComprableインターフェースを実現したクラスの例であれば、この配列を並べ替えることは簡単です。
Arrays.sort(myArray);   //   Arrays sort    ,         compareTo  
 
 
【本章の回顧】この章では、すべての種類の超種類のObjectとして布団類を書き換える必要がある4つの方法と、一つのcompreTo方法を述べました。最も基本的なクラスであるObjectとしては、最も簡単なものと考えられているかもしれませんが、その真の意味を把握できるプログラマーは多くないかもしれません。特に関心を持って、自分で「下の階」のコードを書いているプログラマーにとっては、この章を三回読む価値があります。
 
 
 
 
 
【Effective Java学習ノート】シリーズの連載テーマ:http://tonylian.iteye.com/categories/64208