2017-07-22 2 views
3
// Original class Dog 
    class Dog{ 
    String name; 
    int age; 

} 

//Case 1 
    class Dog implements Comparable<Dog>{ 
      //compareTo() implementation 
     } 


//Case2 
     class Dog implements Comparator<Dog>{ 
     // compare() implementation 
    } 

//Case 3 

    class DogNameComparator implements Comparator<Dog>{ 
    // compare() implementation 
} 



Collection.sort(dogList); 
    Collectios.sort(dogList,new DogNameComparator()); 
    Collection.sort(dogList,new Dog()); 

Comparatorが元のクラスを変更しないと言っても、元のクラスは実際には変更されません。
私はコンセプトを正しく理解していないかもしれませんが、私にそれを教えてください。「Comparableは元のクラスに影響を及ぼしますが、Comparator doesnt」とはどういう意味ですか?

+0

あなたの例に欠陥がある(または不完全である)場合、2番目の例が 'Comparator'自体を提供する必要はありません(実際には見分けが困難になります)。しかし、第3の例が「犬」とは独立していることに注意してください。 –

答えて

2

Comparableは、元のクラスでしか実装できません。そのため、サブクラスを使用してcompareToをオーバーライドしない限り、1つの実装が可能です。一方、Comparatorは元のクラスに実装する必要はありません。そのため、多くの実装が可能です。

あなたの第二の場合はcompareToは2つだけDogインスタンスへのアクセス権を持っているだろうが、3つのDogインスタンス(this、パラメータ#1、及びパラメータ#2)へのアクセスを持つことcompareにおいて、第一のケースとは全く異なる(thisパラメータ#1)。

+0

ありがとう!!!!しかし、まだ、その行「Comparator does notは元のクラスに影響を与えます」は、ケース2がそのやり方ではなくても、それでも許可された実装権を持ち、Dogクラスに実装させるためですcompare()なので、DogクラスはComparatorの影響を実際に受けていますか? –

+0

@ShyamSreenivasanそう、あなたが実装した通り、ケース2は 'Comparator'の影響を受けている' Dog'を示しますが、実際には 'Comparator'として使われることはありません。 'Comparator'の主な用途の1つは、2つのインスタンスを比較する能力を持つために元のクラスのインスタンスを必要としないということです。 – 4castle

+0

Alight!それは素晴らしいです。しかし、Javaがなぜ私たちに最初にそれをさせてくれるのかと疑問に思っただけです。ありがとう! –

関連する問題