[英]Why does javax MimeType not implement equals?
由于缺少重写的equals
-method, 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
在我看来, a
和b
在每个方面都是相同的,并且a.equals(b)
应该返回true
。
有没有理由这个类没有实现equals
-method?
更新:存在一个match
方法,它完全符合我的要求,但我只是在发布这个问题之后发现了哪一种确认了这个类的不那么直观。
我只能推测这个决定没有记录,但是在检查MimeType
类时,有两种匹配方法: match(MimeType)
和match(String)
。 第二个是通过从字符串参数构造MimeType
对象然后调用第一个match
方法来完成它的工作。
因此,通过实现匹配方法,可以与MimeType和String对象进行比较。 通过实现equals(Object)
方法,这是不可能的。 当然,您可以实现equals
方法,以便它可以与MimeType
和String
进行比较,但这会违反equals
文档指定的合同:
它是对称的:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。
这只有在String.equals(Object o)
使用o.toString()
进行比较o.toString()
,但String
doc声明:
将此字符串与指定的对象进行比较。 当且仅当参数不为null并且是表示与此对象相同的字符序列的String对象时,结果才为真。
因此,您只能将equals
实现为与不同的MimeType
进行比较,如果要与String
进行比较,则必须回退到match(String)
方法。
我认为在这个类中不实现equals
的原因只是为了保持用于比较不同对象的一致性的方法来进行比较。
你可以考虑提交一个bug; 乍一看,这似乎是一个应该正确覆盖.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
。 显然不理想,但总比没有好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.