2013-04-28 60 views
2

我有一个公司对象与不同的部门和员工。我已经成功将我的对象序列化并再次将其加载到我的程序中。测试两个对象在结构上是否相等?

现在我想测试这两个对象在结构上是否相等。 java是否提供了一个工具来比较这些对象?

我应该补充说我的对象有一个用其他对象填充的列表。

或者我必须为此编写自己的测试吗?

编辑:

class test{ 

public int a 

} 
test t = new test(); 
t.a = 1; 

test t1 = new test(); 
t1.a = 1; 

现在我想,如果他们是根据它们的值相同,比较T和T1。

+1

只需使用'isinstance'功能检查它们是否是同一类的实例 – 2013-04-28 18:32:12

+8

'结构相等'是什么意思? – 2013-04-28 18:32:41

+0

看看http://commons.apache.org/proper/commons-beanutils//api/org/apache/commons/beanutils/BeanComparator.html – 2013-04-28 18:33:52

回答

5

可以覆盖equals方法Test类如下:

public boolean equals(Object other) { 
    if (other == null) { 
     return false; 
    } 
    if (!(other instanceof Test)) { 
     return false; 
    } 
    return this.a == ((Test) other).a; 
} 

此外:当覆盖等于时,您总是应该总是覆盖hashCode方法。请参阅此参考以了解原因:Why always override hashcode() if overriding equals()?

+5

覆盖等于时总是覆盖哈希码。这应该是你答案的一部分。您的等号方法签名是错误的。 -1直到你改正这个,因为你推荐的不会工作,更糟的是会误导。提示:方法参数! – 2013-04-28 18:43:26

+1

如果您使用的是Eclipse,它可以为您生成hashCode和equals。 – Thierry 2013-04-28 18:44:28

+0

@HovercraftFullOfEels:哎呀。编辑它。 – 2013-04-28 18:46:58

2

听起来像是你可以重写equals方法我认为比较...

2

谷歌番石榴提供ComparisonChain

public int compareTo(Foo that) { 
    return ComparisonChain.start() 
     .compare(this.aString, that.aString) 
     .compare(this.anInt, that.anInt) 
     .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast()) 
     .result(); 
    } 

Apache的共享提供CompareToBuilder

public int compareTo(Object o) { 
    MyClass myClass = (MyClass) o; 
    return new CompareToBuilder() 
     .appendSuper(super.compareTo(o) 
     .append(this.field1, myClass.field1) 
     .append(this.field2, myClass.field2) 
     .append(this.field3, myClass.field3) 
     .toComparison(); 
    } 
} 
相关问题