Java 性能方面的多态性
我有以下问题。我想创建Java 性能方面的多态性,java,polymorphism,cdi,dao,Java,Polymorphism,Cdi,Dao,我有以下问题。我想创建SomeObject。此对象由各种嵌套对象组成,NestedObject1,NestedObject2。。。我创建了映射器来创建那些嵌套对象Mapper1来创建NestedObject1,Mapper2来创建NestedObject2,等等。这些映射程序调用了大量的setter,其中一些需要来自db的某些实体的信息(有些则不需要)。这就是java语言中的问题: public class MyClass { @Inject private MyDao dao
SomeObject
。此对象由各种嵌套对象组成,NestedObject1
,NestedObject2
。。。我创建了映射器来创建那些嵌套对象Mapper1
来创建NestedObject1
,Mapper2
来创建NestedObject2
,等等。这些映射程序调用了大量的setter,其中一些需要来自db的某些实体的信息(有些则不需要)。这就是java语言中的问题:
public class MyClass {
@Inject
private MyDao dao;
@Inject
private Mapper1 mapper1;
@Inject
private Mapper2 mapper2;
@Inject
private Mapper3 mapper3;
@Inject
private Mapper4 mapper4;
@Inject
private Mapper5 mapper5;
public SomeObject map(Integer id) {
SomeEntity entity = dao.findById(id);
SomeObject someObject = new SomeObject();
someObject.setNestedObject1(mapper1.map(entity));
someObject.setNestedObject2(mapper2.map());
someObject.setNestedObject3(mapper3.map(entity));
someObject.setNestedObject4(mapper4.map(entity));
someObject.setNestedObject5(mapper5.map());
return someObject;
}
}
我正在考虑以下重构:
制作一个接口映射器
,并让所有映射器实现此功能。然后我可以插入映射器列表。在mapper上添加或删除将非常容易,无需触摸MyClass
。我认为这是一个好主意,但问题是MyDao
。而不是一个数据库访问,我将需要3
然后,界面看起来像
public interface Mapper {
public void map(SomeObject someObject);
}
public class Mapper1 implements Mapper {
private static final Integer VALUTA = 1;
@Inject
private MyDao dao;
@Override
public void map(SomeObject someObject) {
SomeEntity entity = dao.findById(id); // and I have no idea what the id is
NestedObject1 nestedObject1 = new NestedObject1();
nestedObject1.setSomeField(entity.getSomething());
nestedObject1.setSomeOtherField(VALUTA);
someObject.setNestedObject1(nestedObject1);
}
}
Mapper1
看起来像
public interface Mapper {
public void map(SomeObject someObject);
}
public class Mapper1 implements Mapper {
private static final Integer VALUTA = 1;
@Inject
private MyDao dao;
@Override
public void map(SomeObject someObject) {
SomeEntity entity = dao.findById(id); // and I have no idea what the id is
NestedObject1 nestedObject1 = new NestedObject1();
nestedObject1.setSomeField(entity.getSomething());
nestedObject1.setSomeOtherField(VALUTA);
someObject.setNestedObject1(nestedObject1);
}
}
id在此上下文中是未知的。在签名中包含id?我不知道。。。
Mapper3
和Mapper4
也必须查找实体
我正在考虑一个抽象类,它将在BeforeClass方法中查找实体,但我认为这个get仍然被多次调用
顺便说一句:我知道标题很糟糕,请随意重命名。你能详细说明一下
而不是我需要3次数据库访问吗。
?@WeareBorg Ok,我编辑了我的第一篇文章。那么,你的意思是,因为你有不同的(3)实体实现一个映射器接口,访问/创建列表需要访问数据库3次吗?如果这就是你的意思,那么这是无法逃避的。@Chris311我不确定我是否明白。为什么mapper接口不将SomeEntity对象映射?调用DAO一次,获取实体,并将其传递给所有映射器。@WeareBorg您说过“实现一个映射器接口的不同(3)实体”。不,我的所有实体都没有实现映射器。我将在最初的帖子中用文字解释这个问题。