我是否应该使用“;扩展;在JavaPOJO上提取公共属性?

我是否应该使用“;扩展;在JavaPOJO上提取公共属性?,java,orm,pojo,extends,Java,Orm,Pojo,Extends,我正在Android上使用SQLite ORM来保存和查询数据 我有一些用于ORM的POJO,在这些POJO中有几个相同的属性,比如“timestamp” 因此,我应该将这些公共属性提取到基类中,以防止其他协作者忘记使用这些属性吗?比如说, class BaseEvent { String activityName; //activityName getter and setter } class TouchEvent extends BaseEvent { int x

我正在Android上使用SQLite ORM来保存和查询数据

我有一些用于ORM的POJO,在这些POJO中有几个相同的属性,比如“timestamp”

因此,我应该将这些公共属性提取到基类中,以防止其他协作者忘记使用这些属性吗?比如说,

class BaseEvent {
    String activityName;
    //activityName getter and setter
}

class TouchEvent extends BaseEvent {
    int x;
    int y;
    //x and y's getter and setter
    public TouchEvent(int x,int y,String activityName){...}
}

class AccelerationEvent extends BaseEvent {
    float x,y,z;
    public AccelerationEvent (float x,float y,float z,String activityName){...}
}
忽略特定的ORM(Realm.io),这在设计模式中是一个好的实践吗?

从2015年开始,我们可以看到Realm在真正的多态性方面存在问题

当前领域中的继承让您:

  • 父类上的类方法、实例方法和属性在其子类中继承
  • 以父类为参数的方法和函数可以对子类进行操作
因此,当您使用Realm时,强烈建议使用
composition
而不是
heritation

编辑

让我们使用组合重新编写您的示例:

interface BaseEvent {}

class TouchEvent implements BaseEvent {}

class AccelerationEvent implements BaseEvent {}

class SomeOfYourClass{
    BaseEvent event;
}

是的,你可以把它作为一个设计原则,这样做没有坏处。我从过去四年开始使用hibernate,我们在许多项目中使用这种方法来定义公共属性,例如id和其他类似字段,这些字段将出现在所有表中,但是如上所述,您必须首先检查您的orm是否支持它

您可以参考下面的链接,了解如何在hibernate中完成它


我不知道您的ORM是否支持此功能;Hibernate是这样做的,好吧。为了防止其他合作者忘记使用所需的属性,您可以通过提供一个需要所有必要属性的构造函数来做到这一点。您所说的
使用
,以及
时间戳
之外的其他属性是什么意思?好的,
timestamp
可以在您将记录插入数据库时自动添加(mysql)@ZhaoGang timestamp就是一个例子。使用意味着一些朋友建议我不应该使用extends来减少POJO.Realm上的代码重复,这与Hibernate略有不同。首先,领域是一个MVCC数据库,从C++中的基础构建。MVCC仅仅意味着多版本并发控制。之后,领域不支持继承。任何领域对象都必须继承自
RealmObject
或实现
RealmModel
标记接口,并用
@RealmClass
注释进行标记。不能从不同的领域对象继承。建议使用组合而不是继承。我理解,但如果我正确理解了这个问题,请求者正在寻求更多关于设计原则本身的建议,要求我们忽略与领域相关的具体问题……我的答案也忽略了同样的问题!