モデル内のサービス応答および要求オブジェクトに対して定義されたデータ型はほとんどありません。最近、ToString、HashCode、および Equalsをすべての型に実装して、これらを比較やアサーションよりも利用できるようにする必要があることがわかりました。Java で equals とhashCodeをオーバーライドするときに考慮すべき問題は何ですか? 、equals コントラクトなどを実装する正しい方法 をorg.apache.commons.lang3.builder.EqualsBuilder
使用して toString、equals 、HashCodeBuilder
および hashcode を実装した後ToStringBuilder
、次のように -
Response.java
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
public class Response {
private Integer value;
private Currency currency;
private Object edited;
public Response() {
}
public Response(Integer value, Currency currency, Object edited) {
this.value = value;
this.currency = currency;
this.edited = edited;
}
public Currency getCurrency() {
return currency;
}
public void setCurrency(Currency currency) {
this.currency = currency;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public Object getEdited() {
return edited;
}
public void setEdited(Object edited) {
this.edited = edited;
}
@Override public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Response Response = (Response) o;
return new EqualsBuilder().append(value, Response.value).append(currency, Response.currency)
.append(edited, Response.edited).isEquals();
}
@Override public int hashCode() {
return new HashCodeBuilder(17, 37).append(value).append(currency).append(edited).toHashCode();
}
@Override public String toString() {
return "Response{" + "value=" + value + ", currency=" + currency + ", edited=" + edited + '}';
}
}
通貨.java
public enum Currency {
INR
}
デフォルトのライブラリ バージョンを使用してこれらを実装する際に、私たちの頭に浮かぶ列挙型に関する考えがあります -
データ型に列挙型を含むパラメータが含まれる可能性がある場合、ライブラリのデフォルトのハッシュコードと equals を使用するのは正しいですか? ハッシュコードとイコールの実装をオーバーライドするための正しい最適化されたソリューションを実装するためのライブラリ(コモンズ内で素晴らしいでしょう)のサポートはありますか?
余談ですが、ライブラリの実装にはここで改善が必要ですか、それとも存在するものに対して正しいですか?
編集:クラスObject
フィールド(も実装を追加しましたedited
hashCode をオーバーライドし、これらの実装も同じである場合、懸念は同じです。
オブジェクトのハッシュコードは、ほとんどがメモリにマップされたアドレスであるため、インスタンスごとに異なるものを使用することになりますか?
編集 2 : JIRAの Enum 値の HashCode の一貫性のない実装で懸念が提起されていることもわかります