2013-08-30 135 views
0

假设一个class Member其中成员有Id类型String。我想知道在另一个实现中使用String equals()实现是否会有任何问题。如果field IdLong类型,会更好吗?在另一个equals()实现中使用String的equals()实现?

@Override public boolean equals(Object object){ 
    if(object == null) return false; 
    if(! (object instanceof Member)) return false; 
    Member member= (Member) object; 
    if(this.Id.equals(member.Id)) //<==My concern is here 
     return true; 
    else 
     return false; 
} 
+2

你为什么认为这会有什么问题?运行它时你遇到过吗? –

+5

只要this.Id永远不会为null,你应该没问题。按照惯例,它应该是“id”,而不是“Id”。 –

+0

你应该使用'Objects.equals(Id,member.Id)'。除此之外,没关系。 – nosid

回答

1

我看到的唯一问题是,你可能有多个类的成员除了id和你equals实施会说true即使在两种情况有很大的不同,但有相同的id。考虑到这一点,请确保一致地执行hashCode实施以避免不一致。

另一个想法是定义自定义比较器例如

static Comparator<Member> MEMBER_ID_COMPARATOR = new Comparator<Member>() { 
    @Override 
    public int compare(Member first, Member second) { 
     assert(first.getId() != null); 
     assert(second.getId() != null); 
     return first.getId().compareTo(second.getId()); 
    } 
} 
0

没问题。从这个角度来看,请将Id作为String。如果它只包含数字,是的,您可以使用LongBigInteger(我的偏好)。但这是一个不同的动物。

0

试试这个

@Override public boolean equals(Object object){ 
    if(object == null) return false; 
    if(! (object instanceof Member)) return false; 
    Member member= (Member) object; 
    if (this.Id == null && member.Id == null) 
     return true; 
    else if (this.Id != null && member.Id != null) 
     return this.Id.equals(member.Id); 
    else 
     return false; 
} 
+0

'this.Id == null && member.Id == null'可以被重写为'this.Id == member.Id' – McDowell

0

如果字段与包装类(整数,布尔,等等),实现

然后实现平等的比较简单,因为只有一个case:递归地调用equals方法。

在等号方法中,通常值得对字段比较进行排序,以便首先执行最重要的比较。也就是说,应该首先评估最有可能不同的领域。

这允许“短路”逻辑运算符最小化执行时间。

相关问题