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()
方法的最佳方法是什么?有几个限制条件:
get()
应该作为静态方法实现
- 我想尽可能避免冗余代码,并且不必为
get()
的每个实现指定 class。例如,如果我有 Student
和 Teacher
class,我想避免手动指定 Students.class
和 Teacher.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();
}
为什么要将其设为静态?您将对依赖项进行硬编码并破坏多态性;使得无法使用模拟实现进行测试(不需要真实的数据库)。
我正在 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()
方法的最佳方法是什么?有几个限制条件:
get()
应该作为静态方法实现- 我想尽可能避免冗余代码,并且不必为
get()
的每个实现指定 class。例如,如果我有Student
和Teacher
class,我想避免手动指定Students.class
和Teacher.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();
}
为什么要将其设为静态?您将对依赖项进行硬编码并破坏多态性;使得无法使用模拟实现进行测试(不需要真实的数据库)。