【问题标题】:Track dirty properties with annotations in Java?在 Java 中使用注释跟踪脏属性?
【发布时间】:2014-12-08 01:10:13
【问题描述】:

我有一个问题正在努力解决。我有一些模型对象,如果它们的属性发生变化,我想跟踪它们。由于这些模型的使用模式,我希望跟踪是独立的,以便以下工作:

Student student = new Student();
student.setName = "name";
List<StudentProperties> changedProperties = student.getChangedProperties();
//changedProperties = { StudentProperties.name }

我的第一个直觉是创建一个内部 hashmap 和属性枚举,然后通过修改 setter 来跟踪更改以更新 hashmap。我不是粉丝,因为它不是通用的,因此我不能为我的所有模型使用一个实现。

是否有一个干净的解决方案:

@TrackChanges
public class Student implements Trackable {
    @Track
    private String name;

    public List<StudentProperties> getChangedProperties() {
        //somehow return changed properties
    }
}

通过注释创建一个属性枚举,以及包含可由 getChangedProperties() 返回的属性的映射。

我愿意使用可观察模式,但是我不确定这将如何与模型的客户一起使用(我是否必须强制他们也遵循观察者模式才能使用我的模型?听起来侵入性,因此我不赞成它)。

谢谢

【问题讨论】:

  • 您使用的是 Java SE 吗?如果没有,您可以使用interceptors
  • 我用的是EE,所以我现在来看看拦截器
  • 它要求所有客户端将拦截器添加到 beans.xml 文件中。如果我可以让它自成一体,那就更好了。

标签: java enums annotations


【解决方案1】:

我创建了一个名为 AValueObject 的基类,其中包含处理此问题的 DirtyTracker 属性:https://github.com/subes/invesdwin-util#dirtytracker

我还创建了一个 AspectJ 方面来为您处理 PropertyChangeSupport 事件触发:https://github.com/subes/invesdwin-aspects#propertychangesupportedaspect

【讨论】:

    【解决方案2】:

    看看this solution 基于Aspect(文章的第二部分)和PropertyChangeSupport。它干净而通用

    您可以轻松调整它以限制对@Track 注释的属性的跟踪

    http://yakafokon.wordpress.com/2008/12/02/beans-binding-jsr-295-with-pojo-and-aop

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多