我有一堂课说
class Dog {
String name;
int age;
String collarType;
}
我已经覆盖equals
方法来比较所有3个字段,以确定2只狗是否相等。
现在我的情况是我有2个Dog
个对象,即使2 collarType
个实例的Dog
不同,它们也可以相等。因此,我无法使用equals
方法。
使用新架构编写比较器(仅比较名称和年龄)并检查compare(Dog d1, Dog d2)
是否返回0
最佳方式吗?
答案 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)