为什么javax MimeType没有实现equals?

时间:2017-03-30 06:25:09

标签: java

由于缺少被覆盖的equals方法,javax.activation.MimeType类无法直观地(对我而言)进行比较。请考虑以下代码段;

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 个答案:

答案 0 :(得分: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 doc说明:

  

将此字符串与指定对象进行比较。当且仅当参数不为null并且是一个表示与此对象相同的字符序列的String对象时,结果才为真。

因此,您只能实施equals与其他MimeType进行比较,如果您想与String进行比较,则必须回归match(String)方法。

我认为在这个类中不实现equals的原因只是为了保持用于比较不同对象的一致性的方法来比较。

答案 1 :(得分:0)

您可以考虑提交错误;一目了然,这似乎是一个应该正确覆盖.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。显然不理想,但总比没有好。