現在、川場隆さんの『新 わかりやすいJava オブジェクト指向 徹底解説』という本を読んで勉強しています。
このテキストでは、Comparatorインターフェースはcompareメソッドだけをもつ関数型インターフェースである、と書かれていました。
しかしjavaのAPIを参照してみるとComparatorインターフェースにはcompareメソッドだけでなく、equals()という抽象メソッドもありました。抽象メソッドが二つあるのに関数型インターフェースと呼ばれるのはなぜだろうと自分なりに考えたので、次の考えが正しいのかどうか判断していただけないでしょうか。
1.Comparatorインターフェースの抽象メソッドは一つか、二つか?
Comparatorインターフェースを実装したクラスは、必ずObjectクラスを継承してるはずなのでequalsメソッドは既に具象メソッドとして存在する。従ってComparatorインターフェースの実装においてはequalsメソッドをオーバーライドする必要はなく、compareメソッドだけをオーバーライドすれば良い。
つまり、Comparatorインターフェースの本質的な抽象メソッド(オーバーライドが必ず要求されるメソッド)は実質compareメソッドの一つしかない。
よってComparatorインターフェースの(本質的な)抽象メソッドは一つであるため、関数型インターフェースである。
2.なぜ不必要に思える抽象メソッドequals()をComparatorインターフェース内に書いたのか?
上記の考え方であれば、Comparatorインターフェースの中にequalsメソッドを抽象メソッドとして書いておく必要がありません。なぜこんなものを書いておいたのか疑問に思っていましたが、ComparatorインターフェースのequalsメソッドのAPIをみたところ次のような説明文がありました。
Indicates whether some other object is "equal to" this comparator. This method must obey the general contract of Object.equals(Object). Additionally, this method can return true only if the specified object is also a comparator and it imposes the same ordering as this comparator. Thus, comp1.equals(comp2) implies that sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) for every object reference o1 and o2.
つまり、Comparatorインターフェースを実装したクラスのインスタンスの等価性は、上述のほげほげの時に限りtrueを返しなさいと言っています。確かに、この説明文がないとうっかり変なオーバーライドをしてしまうかもしれません。
すなわち、この説明文をAPIに書くためだけにわざわざ不必要に見えるequals()をComparatorインターフェースの中に書いていた(と予想しています)。
※またこの後の説明文に、equals()をこのようにオーバーライドしておけばパフォーマンスが向上することもあるよ、と書かれていました。equals()のオーバーライドはあくまでも必須ではない点が、実装先のクラスでわざわざオーバーライドをせずともエラーにならない点と合致していて、自分の中ではより納得しています。
一応、APIの参照を載せておきます。
ComparatorインターフェースのAPI
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/19 02:55
2021/03/19 02:59
2021/03/19 03:03