首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >instanceof vs isAnX()

instanceof vs isAnX()
EN

Stack Overflow用户
提问于 2011-05-19 19:40:47
回答 1查看 346关注 0票数 1

在java中,我正在编写一些DTO对象,它们都继承自AllocationDTO

然后将这些对象的列表传递到DAO对象中,以保存到数据库中。

根据要保存的AllocationDTO的子类型,保存逻辑会发生变化(例如,要保存到数据库中的哪个表,等等)。

我发现我自己使用的代码是这样的:

代码语言:javascript
复制
for (AllocationDTO x : listOfAllocationDtos) {
    if (x instanceof ManagerAllocationDTO) {
         Manager m = (x(ManagerAllocationDTO)).getManager();
         // save manager etc to managerallocs
    } else if (x.getId() == AllocationDTO.TYPE_SPECIAL1) {
         // save to specialAlloc1 table
    } else if (x.getId() == AllocationDTO.TYPE_SPECIAL2) {
         // save to specialAlloc2 table
    }
}

ManagerAllocationDTO有一个额外的字段,将分配与管理器联系起来,但对于特殊的alloc1/2情况,我没有创建子类型,因为数据中唯一的区别是它保存到的表。

我的问题有点软设计问题--这是做这件事的最佳方式吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-19 19:45:00

分离不同实例的一种方法是使用Visitor Design pattern,而无需instanceOf和if-else-cascade。

  • 新接口:对AllocationDTO:

的每个具体子类使用一个方法的AllocationVisitor

代码语言:javascript
复制
- visit(TYPE\_SPCIAL1 dto)
- visit(TYPE\_SPCIAL2 dto)

  • AllocationDTO:抽象listOfAllocationDtos.

acceptVisitor(AllocationVisitor访问者)

  • AllocationDTO的每个concreate子类以这种方式实现acceptVisitor():void acceptVisitor(AllocationVisitor visitor){visit(this);} //通过编译时类型选择正确的访问方法。

  • 您的AllocationVisitor实现了AllocationVisitor接口(具有内部类),创建了该接口的一个实例,并将其传递给了DTO的元素

DAO:

代码语言:javascript
复制
AllocationVisitor saveVisitor = new AllocationVisitor() {
  visit(TYPE_SPCIAL1 dto) {//what ever you need}
  visit(TYPE_SPCIAL2 dto) {//what ever TYPE_SPCIAL2 needs}
}
for (AllocationDTO x : listOfAllocationDtos) {
  x.visit(saveVisitor);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6058063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档