为单个类实现多个equals方法

时间:2016-09-27 21:08:17

标签: java equals comparator

我有一堂课说

class Dog {
    String name;
    int age;
    String collarType;
}

我已经覆盖equals方法来比较所有3个字段,以确定2只狗是否相等。

现在我的情况是我有2个Dog个对象,即使2 collarType个实例的Dog不同,它们也可以相等。因此,我无法使用equals方法。

使用新架构编写比较器(仅比较名称和年龄)并检查compare(Dog d1, Dog d2)是否返回0最佳方式吗?

3 个答案:

答案 0 :(得分:0)

正如您所注意到的,平等对用户来说是主观的。然而,唯一真正的平等是正确的。应该是你对象上的那个(它可能是一个完全等价的,因为让一个不太严格的版本是正确的将是奇怪的)。这等于应该说在任何情况下都无法以任何方式想象,如果它们相等,则对象1和对象2是不同的。

其他('主观')等于方法应该通过比较器来实现,是的,我认为你应该使用比较器。此外,您应该恰当地命名该比较器(如NameAndAgeComparator),以区分它们,因为您还可以设想DogRaceComparator和SizeComparator按大小排序。

您可以(可能)为比较器提供一个静态等于方法,以便您使用静态导入(例如 equals(dog1,dog2) )来引用它。但那只是我的2美分

答案 1 :(得分:0)

你的课应该是这样的:

class Dog 
{
    final String name;
    final Integer age;
    final String collarType;

    public boolean equals(Object other) 
    {
       return this.name.equals(other.name) && 
              this.age.equals(other.age) &&
              this.collarType.equals(other.collarType);
    }
}

如果这些属性中的任何一个是可变的,那么你的问题就会变得更加明确。

如果这些字段中的任何字段与equals不相关,那么该字段应该是不同的Type

public interface Named(){public String name(); } public interface Aged(){public String age(TimeUnit timeUnit); } public interface Collarable {public String collarType(); }

然后你有:

public class Dog implements Named, Aged, Collarable { /* brevity */ }

并提供这些接口的自然 Comparator<Named>Comparator<Aged>Comparator<Collarable>实现。

答案 2 :(得分:0)

  • 如果将其置于任何类型的Map或Set中,则实现equals和hash代码。
  • 如果要对它们进行排序,请实现Comparable接口,但它应与实现的equals和hashcode方法兼容。
  • 如果要使用除equlas和hashcode方法之外的其他字段对列表进行排序/比较,请使用Comparator实现。