Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 性能方面的多态性_Java_Polymorphism_Cdi_Dao - Fatal编程技术网

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)实体”。不,我的所有实体都没有实现映射器。我将在最初的帖子中用文字解释这个问题。