[英]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.