Java:从超类强制执行静态方法(Mongo / Morphia上下文)

时间:2015-01-19 11:21:10

标签: java mongodb morphia nosql

我正在为Java中的ODM设计架构。我有一个带有顶级抽象Document类的层级结构。 DB对象的实现将扩展此类。

public abstract class Document {
    ObjectId id;
    String db;
    String collection;
}

public class Student extends Document {
    db = "School";
    collection = "Student";

    String name;
    int age;
    float gpa;
}

我希望每个类能够静态获取其关联集合的结果。例如,我想做Students.get(Students.class, new ObjectId(12345))这样会从数据库中返回Student的内容。请注意,我需要在get()方法中指定类,这是我正在使用的对象映射器库的限制(Mor​​phia)。

强制每个类使用此get()方法的最佳方法是什么?有几个限制因素:

  1. get()应该作为静态方法实现
  2. 如果可能,我想避免使用冗余代码,而不必为get()的每个实现指定类。例如,如果我有StudentTeacher类,我想避免手动指定Students.classTeacher.class。我不确定这是否可行,因为get()是一种静态方法。
  3. 我认为这是常见的抽象静态 Java问题的变体,但我想确保我先以正确的方式接近它。

1 个答案:

答案 0 :(得分:1)

我认为你的学生班应该是这样的:

@Entity(name="Student")
public class Student extends Document {
    protected String name;
    protected int age;
    protected float gpa;
    ...
}

通用查询会是这样的:

public <E extends BaseEntity> E get(Class<E> clazz, final ObjectId id) {
    return mongoDatastore.find(clazz).field("id").equal(id).get();
}

为什么要让这个静态?你需要硬编码依赖关系并破坏多态性;使得无法使用模拟实现进行测试(不需要真正的数据库)。