使用`equals`进行不同单位的长度比较是不是很糟糕?

时间:2015-12-02 15:12:58

标签: java equals equivalent

在另一个问题中,我的代码有equals方法:

public class Length {

    private final double value;
    private final Unit unit;

    public Length(double value, Unit unit) {
        this.value = value;
        this.unit = unit;
    }

    @Override
    public boolean equals(Object obj) {
        Length length = (Length) obj;
        return this.unit.toMM(this.value) == length.unit.toMM(length.value);
    }
}

我想比较两个Length,如果它们可以转换为具有相同长度值的相同单位,则它们彼此相等

@weston在this answer下给了我一些非常好的解释,说明我为什么不在这里使用equals,但我还不太清楚。

1 个答案:

答案 0 :(得分:3)

基本上,他说10mm1cm不应该相等。这是值得商榷的,由你决定。

作为参考,您可以采用类似于BigDecimal的方法:

new BigDecimal("1.0").equals(new BigDecimal("1.00"))    //false
new BigDecimal("1.0").compareTo(new BigDecimal("1.00")) //0

另一个例子是java.time.Period

  

请注意,这意味着一段时间" 15个月"不等于" 1年和3个月"。

或者你也可以决定10毫米和1厘米相等。以java.time.Duration

为例
  

比较基于持续时间的总长度。

最后,重要的是要清楚地记录正在做的事情。