赞
踩
你的第二个和第三个项目符号(使用X.equals(Object)或回退到Object.equals(Object))不需要任何努力,因为无论如何在调用可覆盖的方法Object.equals(Object)时会发生什么,它将使用它能找到的最具体的重写方法.
因此,唯一剩下的任务是调用X.equals(X)方法(如果适用).要最小化相关成本,您可以缓存结果.从Java 7开始,有一个类ClassValue允许将信息与类相关联,以线程安全,懒惰评估和高效查找方式,仍然支持密钥类的垃圾收集(如果需要).
因此,Java 7解决方案可能如下所示:
import java.lang.invoke.*;
public final class EqualsOperation extends ClassValue {
public static boolean equals(Object o, Object p) {
if(o == p) return true;
if(o == null || p == null) return false;
Class> t1 = o.getClass(), t2 = p.getClass();
if(t1 != t2) t1 = commonClass(t1, t2);
try {
return (boolean)OPS.get(t1).invokeExact(o, p);
} catch(RuntimeException | Error unchecked) {
throw unchecked;
} catch(Throwable ex) {
throw new IllegalStateException(ex);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。