我有一个依赖于注释的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字段中的每个对象都需要有自己的注释,以指示特定字段是存储还是可搜索,以便与预定义属性保持一致,例如名称。
我可以想到两个选择:
对于每个附加字段,开发人员必须创建一个 匿名类实现接口字段和内部 匿名类,开发人员将声明适用 注释
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});
没有构造可以将注释作为参数传递: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;
}
}
我对这两种选择都不是特别兴奋,并希望有人能给我一些指示
答案 0 :(得分:0)
如果你需要一个可扩展的对象模型,我会说POJO设计只是为了额外的工作而不是暴露一个元模型。
那就是说,你可以做的是拥有API子类MyPOJO
的客户端,并注释他们在子类中定义的属性。然后,您将使用反射来遍历您正在接收的对象的所有JavaBeans属性,并确定getter上的注释 - 类似于JPA的工作方式。