2013-04-28 84 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(); 
    } 
}