簡體   English   中英

為什么javax MimeType沒有實現equals?

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

在我看來, ab在每個方面都是相同的,並且a.equals(b)應該返回true

有沒有理由這個類沒有實現equals -method?

更新:存在一個match方法,它完全符合我的要求,但我只是在發布這個問題之后發現了哪一種確認了這個類的不那么直觀。

我只能推測這個決定沒有記錄,但是在檢查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()進行比較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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM