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

Java: Enforce static method from super class (Mongo/Morphia context)

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

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;
}

我希望每个 class 都能够静态获取其关联集合的结果。例如,我想做一些类似 Students.get(Students.class, new ObjectId(12345)) 的事情,这将从数据库中 return 一个 Student。请注意,我需要在 get() 方法中指定 class,这是我使用的对象映射器库 (Morphia) 的限制。

强制每个 class 使用此 get() 方法的最佳方法是什么?有几个限制条件:

  1. get() 应该作为静态方法实现
  2. 我想尽可能避免冗余代码,并且不必为 get() 的每个实现指定 class。例如,如果我有 StudentTeacher class,我想避免手动指定 Students.classTeacher.class。我不确定这是否可行,因为 get() 是一个静态方法。

我认为这是常见 abstract static Java 问题的变体,但我想确保我首先以正确的方式处理它。

我假设您的学生 class 应该看起来像这样:

@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();
}

为什么要将其设为静态?您将对依赖项进行硬编码并破坏多态性;使得无法使用模拟实现进行测试(不需要真实的数据库)。