2017-08-01 86 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 /之后验证) –