この質問は、具体的にはさまざまな実装の代替案のパフォーマンスとある程度の簡潔さです。Javaでの等価性のパフォーマンス(instanceOf vs isAssignableFrom)
私は平等の権利を実装する上でthis articleと自分自身をリフレッシュしました。私の質問は特にcanEqual
に相当します(同等の関係を保証するため)。
canEqualsメソッドではなく、階層内のすべてのクラスでinstanceOfを使用します(paramenterのインスタンスはコンパイル時クラスです)。 isAssignableFrom(動的に解決される)は、トップレベルのクラスでのみ使用してください。多くの簡潔なコードを作成し、3番目のメソッドをオーバーロードする必要はありません。
ただし、この代替方法が有効です。私が気づく必要のあるパフォーマンス上の考慮事項はありますか?
enum Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET;
}
class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override public boolean equals(Object other) {
boolean result = false;
if (other instanceof Point) {
Point that = (Point) other;
//Option 1
//result = (that.canEqual(this) && this.getX() == that.getX() && this.getY() == that.getY());
//Option 2
//result = (that.getClass().isAssignableFrom(this.getClass()) && this.getX() == that.getX() && this.getY() == that.getY());
//Option 3
//result = (getClass() == that.getClass() && this.getX() == that.getX() && this.getY() == that.getY());
}
return result;
}
@Override public int hashCode() {
return (41 * (41 + x) + y);
}
public boolean canEqual(Object other) { return (other instanceof Point); }
}
public class ColoredPoint extends Point{
Color color;
public ColoredPoint(int x, int y, Color color) {
super(x, y);
this.color = color;
}
@Override public boolean equals(Object other) {
boolean result = false;
if (other instanceof ColoredPoint) {
ColoredPoint that = (ColoredPoint) other;
result = (this.color.equals(that.color) && super.equals(that));
}
return result;
}
@Override public int hashCode() {
return (41 * super.hashCode() + color.hashCode());
}
@Override public boolean canEqual(Object other) { return (other instanceof ColoredPoint); }
public static void main(String[] args) {
Object p = new Point(1, 2);
Object cp = new ColoredPoint(1, 2, Color.INDIGO);
Point pAnon = new Point(1, 1) {
@Override public int getY() {
return 2;
}
};
Set<Point> coll = new java.util.HashSet<Point>();
coll.add((Point)p);
System.out.println(coll.contains(p)); // prints true
System.out.println(coll.contains(cp)); // prints false
System.out.println(coll.contains(pAnon)); // prints true
}
}
1つのコメント - このinstanceOfタイプのロジック(通常は)を使用している場合は、通常はequalsメソッドをfinalにする必要があります。 (私はしばしばそれを無視する)。私は答えにさらにコメントをしなければならないかもしれません。 – user949300
ええ、詳しく教えてください。 – smartnut007
私は今あなたが欲しいものについて完全に混乱しています。 PointとColoredPointが同じになることはありますか? ColoredPointはいつでもポイントに等しいことができますか?どちらの答えも問題ありません。しかし、あなたはあなたのアプリケーションのために欲しいですか? – user949300