2017-08-01 111 views
1

我的項目有要求知道是否使用更改數據,但我不允許修改數據模型本身。例如,我有類是這樣的:如何監視類變量的變化?

public class Person { 
    String firstName; 
    String lastName; 
    Address address; 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
    public Address getAddress() { 
     return lastName; 
    } 
    public void setAddress(Address address) { 
     this.address= address; 
    } 

} 

它應該永遠是POJO這個樣子,我不能調用中的getter/setter任何其他方法,所以有一些解決方案,但它不是適合我要求:

我也不能在這裏應用Observer模式。

我目前的解決方案是:在初始化人員實例後,我將其解析爲JSON並創建一個哈希(MD5),每當我想檢查更改時,我都會再次執行該邏輯並將新哈希與舊哈希進行比較。如果不一樣,那意味着我的數據已經改變。不知何故,它工作正常,但我仍然擔心它,不知道這是否好方法。

+0

爲什麼不能只需使用''==比較? –

+2

你陳述一個模糊的目標,然後消除所有通常的方法來實現這個目標。如果您通過解釋使之成爲必要的高級業務案例來開始,這將有所幫助。 –

+0

你也表明你有什麼作品......所以你不清楚你真的在問什麼? – TylerH

回答

1

這取決於一些因素:

是POJO序列化/實現的hashCode /等於? 你可以克隆你的對象,並檢查等於

你可以改變對象的引用嗎? 您可以擴展您的對象類並在方法中添加一些檢查。

要序列化爲JSON,您可以使用GSON lib: https://github.com/google/gson from谷歌。之後,你可以檢查字符串等於

Maven的依賴性:

<dependency> 
    <groupId>com.google.code.gson</groupId> 
    <artifactId>gson</artifactId> 
    <version>2.8.1</version> 
</dependency> 

https://mvnrepository.com/artifact/com.google.code.gson/gson/2.8.1

+0

hi @Martinus_ 是的,我可以改變參考,所以我不能按對象比較。你的解決方案與我相似。感謝您的幫助 –

+0

因此,如果您可以更改引用,則可以使用變量進行委託並使用check和super.method()重寫set方法。你也可以使用Mockito.spy(我不確定在生產代碼中使用Mockito是否是個好主意),但Mockito會爲你做代表。 (Mockito.spy /之後驗證) –