能否使用equals()方法比较两个独立的回调对象实例?
解决方案
由于你的ActionImpl类没有任何字段,所有实例在逻辑上是等价的,因此可以通过判断对象类型来实现equals方法,同时必须重写hashCode方法(遵循Java的equals-hashCode约定,否则集合类会出现异常行为)。
修改后的完整代码
import javax.annotation.Nullable; interface Action { void apply(); } class ActionImpl implements Action { @Override public void apply() { System.out.println("Hi from" + this); } @Override public boolean equals(@Nullable Object obj) { // 直接判断是否为ActionImpl类的实例 return obj instanceof ActionImpl; } @Override public int hashCode() { // 所有实例返回相同哈希值,满足equals为true时hashCode一致的约定 return ActionImpl.class.hashCode(); } } public class Main { public static void main(String[] args) { Action action1 = new ActionImpl(); Action action2 = new ActionImpl(); System.out.println(action1.equals(action2)); // 输出 true } }
关键说明
equals方法逻辑:因为类没有字段区分实例,所有ActionImpl的对象都视为相等,只需判断传入对象是否属于该类即可。- 重写
hashCode的必要性:Java规范要求,若两个对象通过equals判断为相等,它们的hashCode必须相同。这里返回类的哈希值,确保所有实例的哈希值一致。 - 后续扩展注意:如果之后给
ActionImpl添加了字段,需要同步更新equals和hashCode的逻辑,否则会破坏相等性约定。
内容的提问来源于stack exchange,提问作者Ahmad Hamwi
相关产品推荐
相关产品推荐

