java—重构稍有不同的if语句序列

6za6bjd0  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(314)

我在一个类中发现了以下代码片段,它们有3种不同的方法:

if (errCode == IN_ERR_CONST_1)
    throw new CustomException(OutErrorType.TYPE_A);
if (errCode == IN_ERR_CONST_2)
    throw new CustomException(OutErrorType.TYPE_A);
...
if (errCode == IN_ERR_CONST_9)
    throw new CustomException(OutErrorType.TYPE_B);
if (errCode == IN_ERR_CONST_10)
    throw new CustomException(OutErrorType.TYPE_B);

我最初想通过将其全部放在一个方法中并使用一些Map来重构它,但后来我意识到每个方法中的ifs序列略有不同,即其中一个ifs语句后面是不同的代码块。
例如,在一种方法中,我们可以:

if (errCode == IN_ERR_CONST_2)
    throw new CustomException(OutErrorType.TYPE_A);

第二种方法是:

if (errCode == IN_ERR_CONST_2)
    throw new CustomException(OutErrorType.TYPE_B);

其他一切都一样。
我怎样才能解决这个问题?

qjp7pelc

qjp7pelc1#

你能做一些这样的策略吗;

enum OutErrorType {

    TYPE_A, TYPE_B, UNKOWN_ERROR;

    private static Map<Integer, OutErrorType> MAP;
    static {
        MAP = new HashMap<>();
        MAP.put(IN_ERR_CONST_1, OutErrorType.TYPE_A);
        MAP.put(IN_ERR_CONST_2, OutErrorType.TYPE_A);
        MAP.put(IN_ERR_CONST_9, OutErrorType.TYPE_B);
        MAP.put(IN_ERR_CONST_10, OutErrorType.TYPE_B);
    }

    public static OutErrorType getTypeByCode(int errCode) {
        return MAP.getOrDefault(errCode, OutErrorType.UNKOWN_ERROR);
    }
}

您将合并此枚举上的所有配置,并且可以在没有任何if的情况下获取

i86rm4rw

i86rm4rw2#

您可以将map用于这样的情况(例如,在类构造函数中):

Map<String,OutErrorType> errorsMap = new HashMap<>();
   errorsMap.put(IN_ERR_CONST_1, OutErrorType.TYPE_A);

  ...

那你就用

OutErrorType outErrorType = errorsMap.get(errCode);
if(outErrorType != null) {
    throw new CustomException(outErrorType);
}

相关问题