为什么javax MimeType没有实现equals方法?

6

javax.activation.MimeType类没有重写equals方法,因此在比较时不够直观。请看以下示例代码:

MimeType a = new MimeType("image/png");
MimeType b = new MimeType("image/png");

a.equals(b);                            // false

a.toString().equals(b.toString());      // true
a.getBaseType().equals(b.getBaseType());// true
a.getSubType().equals(b.getSubType());  // true
a.getParameters().size();               // 0
b.getParameters().size();               // 0

在我看来,ab在各个方面都是相等的,因此a.equals(b)应该返回true

这个类为什么没有实现一个equals方法呢?

更新:其实已经存在一个match方法,它恰好可以满足我的需求,但是我发帖之后才发现这一点,这也印证了这个类不太直观的特点。

2个回答

1
你可以考虑提交一个缺陷报告;乍一看,这似乎是一个应该正确重写 .equals().hashCode() 的类。当然,这对你暂时没有帮助(不确定这个库是否在JDK的发布周期中)。
作为解决方法,你可以创建一个子类或包装类来正确实现 .equals().hashCode(),例如:
public class ValueMimeType extends MimeType {
  // constructors

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o instanceof ValueMimeType) { // not MimeType, as that wouldn't be symetric
      return match((ValueMimeType) o);
    }
    return false;
  }

  @Override
  public int hashCode() {
    return toString().hashCode();
  }
}

始终使用ValueMimeType而不是MimeType。显然并不理想,但总比没有好。


确实,已经提交了错误报告:https://bugs.openjdk.java.net/browse/JDK-8236541 - foo

0

我只能推测这个决定没有记录,但是在检查 MimeType 类时,有两个匹配方法:match(MimeType)match(String)。第二个方法通过从字符串参数构造一个 MimeType 对象,然后调用第一个 match 方法来完成其工作。

因此,通过实现匹配方法,可以比较 MimeType 和 String 对象。通过实现 equals(Object) 方法是不可能的。当然,你可以实现 equals 方法,使其可以比较 MimeTypeString,但这将违反由 equals 文档指定的契约:

它是对称的:对于任何非空引用值 x 和 y,如果且仅当 y.equals(x) 返回 true 时,x.equals(y) 应该返回 true。

这只有在 String.equals(Object o) 使用 o.toString() 进行比较时才有效,但是 String 文档说明:

比较此字符串与指定对象。当且仅当参数不为 null 且是表示与此对象相同字符序列的 String 对象时,结果为 true。
因此,您只能实现 equals 来比较不同的 MimeType,如果要比较 String,则必须回退到 match(String) 方法。
我认为不在此类中实现 equals 的原因只是为了保持用于比较不同对象的方法一致。

4
你说得对,将.match(String)命名为.equals(String)或者让.equals(Object)比较String值是否相等都是错误的,但这与实现.equals()无关。在正确实现MimeType.equals(Object)方法的同时,保留现有的.match()方法也是完全合理的。 - dimo414

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接