如何根据switch case中的情况实现不同的返回类型

时间:2015-08-12 11:11:29

标签: java

我编写了一个基于切换条件的结果返回不同类型的方法。根据案例,我无法获得不同的退货类型。

public Object callCommonMethod(char key, Customer customer)
        throws SFWException, ServiceException, CloneNotSupportedException {

    switch (key) {

    case 'C':
         performGetCDBProfile(customer.getWizardNum());
         dbData=true;
         break;

    case 'U':
        performUpdate(cdbProfileInfo);
        break;

    case 'D':
        updateCDBProfile(cdbProfileInfo);
        break;

    case 'W':
        updateWebProfile(customer);
        break;

    case 'M':
         ObjectMappingService.mapInfoToEDO(cdbProfileInfo);
        break;
    }
    return customer;
}

如何实现performGetCDBProfile(customer.getWizardNum());返回cdbProfileInfo objperformUpdate(cdbProfileInfo);updateCDBProfile(cdbProfileInfo);是没有返回类型的方法,updateWebProfile(customer);返回客户对象

3 个答案:

答案 0 :(得分:1)

只能声明方法返回一个类型。您可以返回不同的子类型,但编译器只会在编译时知道您返回已声明的基类。

通常情况下,如果您的子类型密切相关,并且您的调用代码可以在不知道您的实际类型是什么的情况下对这两种类型起作用(这是多态性的本质),这不是问题,例如< / p>

Vehicle v = getBusOrCar();
v.drive();

如果您不能像上面那样做一些有用的事情(例如,您因为那是最常见的基本类型而返回一个对象),那么对我来说就是代码味道。你的方法是做两个不同的事情吗?

如果你想选择性地返回一些东西,你可以随时返回你的对象(Customer类型?)或null,在收到/使用之前检查null。另一种可能性是返回Optional容器,因此API表明您可能获取对象。

无论哪种方式,在我看来,或许你的方法可能有各种各样的责任。也许你的switch语句应该为每种情况委托更多的功能到另一个方法/类,所以你不需要返回一个对象然后对它采取行动呢?

答案 1 :(得分:1)

如果你有一个方法,它看起来应该返回不同实体,类型的对象 - 那么你的架构肯定有问题。
最有可能的是,您的方法会破坏single responsibility principle

不要使用常用方法实现接口或创建任何其他黑客攻击。改变调用的逻辑。请记住:抽象不应该依赖于细节。

拆分你的方法。为什么有人会在一种方法中返回Customer个对象或cdbProfileInfo? 如果要从具有不同键的单个位置调用此方法,那么您将如何处理不同类型的结果?如果您打算使用来自不同位置的不同键调用此方法 - 那么,您可以简单地将此方法拆分。

答案 2 :(得分:1)

  1. 在调用方法中返回Object并检查其实例是一种不好的做法。
  2. 即便如此,如果你仍想实现目标,为什么你不能在这两种方法没有任何回报的情况下返回null? (不推荐)