【问题标题】:Java: Enforce static method from super class (Mongo/Morphia context)Java:从超类强制执行静态方法(Mongo/Morphia 上下文)
【发布时间】:2015-01-19 11:21:10
【问题描述】:

我正在为 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() 方法中指定类,这是我正在使用的对象映射器库(Morphia)的限制。

强制每个类都有这个get() 方法的最佳方法是什么?有几个限制:

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

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

【问题讨论】:

    标签: java mongodb morphia nosql


    【解决方案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();
    }
    

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

    【讨论】:

    猜你喜欢
    • 2012-02-11
    • 2012-04-24
    • 2017-09-29
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多