'动态' - 像java注释?

时间:2011-09-28 17:13:07

标签: java annotations

我有一个依赖于注释的pojo。它具有预定义字段以及包含用户提供的字段的集合:

public class MyPOJO implements Document {

  private String id;
  private LocalString name;
  private LocalString desc;
  private List<Field> fields;

  public MyPOJO(final String id,
                          final LocalString name,
                          final LocalString desc,
                          final List<Field> fields) {
    this.id = id;
    this.name = name;
    this.desc = desc;
    this.fields = fields;
  }

  public String getId() {
    return id;
  }

  @Indexed(searchable = false, stored = true)
  public LocalString getName() {
    return name;
  }

  @Indexed(searchable = true)
  public LocalString getDescription() {
    return desc;
  }

  public List<Field> getFields() {
    return fields;
  }

}

MyPOJO是一个“通用”对象,即MyPOJO的开发人员(或消费者)拥有未在MyPOJO中预定义的字段,因此开发人员需要将这些附加字段放在属性“字段”中。问题产生于以下事实:Set字段中的每个对象都需要有自己的注释,以指示特定字段是存储还是可搜索,以便与预定义属性保持一致,例如名称。

我可以想到两个选择:

  1. 对于每个附加字段,开发人员必须创建一个 匿名类实现接口字段和内部 匿名类,开发人员将声明适用 注释

  2. Set'fields'包含fieldname,fieldvalue的复杂对象 和注释如下所示。我无法弄清楚如何调用Field的构造函数。下面的代码不能编译,但它是伪代码,用于表示我想要做的事情。

    字段myfield1 = new Field(“dateofBirth”,new Date(),new ArrayList({Index.stored,Index.searchable}); 字段myfield2 = new Field(“model”,“330i”,new ArrayList({Index.stored});

  3. 没有构造可以将注释作为参数传递:new ArrayList({Index.stored}。

    public class Field  {
    
      private String name;
      private Object value;
      Collection<Annotation> annotations;
    
      public Field(final String name, final Object value, Collection<Annotation> annotations;) {
        this.name = name;
        this.value = value;
        this.annotations = Collections.unmodifiableCollection(annotations);
      }
    
      public String getName() {
        return name;
      }
    
      public Object getValue() {
        return value;
      }
    }
    

    我对这两种选择都不是特别兴奋,并希望有人能给我一些指示

1 个答案:

答案 0 :(得分:0)

如果你需要一个可扩展的对象模型,我会说POJO设计只是为了额外的工作而不是暴露一个元模型。

那就是说,你可以做的是拥有API子类MyPOJO的客户端,并注释他们在子类中定义的属性。然后,您将使用反射来遍历您正在接收的对象的所有JavaBeans属性,并确定getter上的注释 - 类似于JPA的工作方式。