2015-09-22 28 views
11

Javaは、「null -safe」またはnull「許容」メソッドを含むObjectsクラスを導入しました(compare(T, T, Comparator<T>)を含む)。しかし、ときに私が今まで単にObjects.compare()メソッドの目的は何ですか?

comparator.compare(left, right); 

を呼び出す上

Objects.compare(left, right, comparator); 

を使うのでしょうか?

Objects.comparenullの場合のみです。comparatorの場合はセーフなので、なぜ私は比較呼び出しをラップしますか?オブジェクトのアイデンティティの最初のチェックの最適化は、コンパレータ自体で実行する必要があるようです。そして、私が見ることができる行動の唯一の本当の違いはObjects.compareはそうではないcomparatorleftrightのすべてが、nullある場合comparator.compare(left, right)NullPointerExceptionを投げることです。これは実際には、新しい標準ライブラリメソッドを保証するのに十分な重要な考慮事項のようではありません。

私はここで何かが分かりませんか?

+2

、私は同意するものとします。 [Guavaの 'Ordering'](https://code.google.com/p/guava-libraries/wiki/OrderingExplained)は、その問題を解決するのにもっと良い仕事をしています。 –

+0

このメソッドはJDKのどこでも使用されていません。おそらく役に立たないでしょう。 – ZhongYu

+0

このメソッドが行う唯一のことは、コンパレータがそのケースをテストしない場合に、両方の引数がnullであるかどうかをチェックすることです。そのクラスの大部分のように、かなり無駄です。 – njzk2

答えて

14

これはうんざりしていました。この.compare()メソッドと共にObjectsクラスは、3b45b809d8ffにJoe Darcyによって紹介されました。コミットメッセージにはBug 6797535が記載されており、 "Sherman"(Xueming Shen?)が署名しています。このバグに加えて、Objectsに追加する機能について議論した2009年9月からのthis threadがあります。スレッドの人々は、compare(int, int)(と同様の)プリミティブ比較メソッドを追加し、最終的にはそれぞれのラッパークラスに存在することを決定します(Integer.compare()参照)。この方法はlater in that threadに導入されていますが、私が見つけることができる解説はありません。

Objects.compare()を含むその後 a patch is sent out for review

、およびJoshua Bloch repliesは:

私はあなたがこの方法(比較(T、T bの、コンパレータC))を追加する必要はないと思います。その有用性は不明であり、このクラスの他の方法のパワー対重量比は ではありません。

Darcy responds

ええ、私はこれを含め "項目12:Comparableを実装を検討し、" 心の中でEJv2から 。

この方法がItem 12に関するテーブルにもたらすものはわかりませんが、問題は再度発生していないようです。私は、その意図は、プリミティブcompare()に相当するメソッドを文法上の理由から提供することであると推測しましたが、実際にはその理由がわかりませんでした。


それはダーシーとブロッホの間で同じ交換でObjects.toString()方法は、同様にブロッホによって批判されていることに気付い価値がある:

私は間違いなく/ /このメソッド(Objects.toString)を追加しないでしょう。テーブルには何ももたらされていません。人々はString.valueOfを知り、使用します。もう一つの選択肢を追加して水を泥だらけにしましょう。

しかし、我々はそれが削除されなかった知っているように、ダーシーは単に答えた:

だから指摘しました。


これはかなり意図せずに導入されたようなので、結論では、それは私には思えます。それが提案され、提起された異議は、それがチェックインされるのを妨げていませんでした。私は、より厳密な設計レビューが、ブロッホが示唆したように、それを放置する側で間違っていたと想像します。あなたもこの同様の問題(それは実装の詳細ではなく、APIの変更についてですが)に興味があるかもしれない

:このメソッドは絶対に愚かであるWhy is Arrays.fill() not used in HashMap.clear() anymore?

+2

バウンスが入ってきました。あなたの研究と素晴らしい答えをありがとう。これを補うことは、歴史から学ぶことができることです。一般的にはAPI設計に関する洞察と、Oracleプロセスへの洞察です。ジョシュブロッホ神のようなレベルが確認されました。それは男が公に目に見えないほど残念だ。 –

+1

私の喜び:)私はいつもこのような決定がなされた理由を掘り下げて楽しんでいます。 – dimo414

関連する問題