Java 简化条件算法的Intellij检查规则

Java 简化条件算法的Intellij检查规则,java,intellij-idea,sonarqube,Java,Intellij Idea,Sonarqube,我们有一些简短的方法可以将一些值从一个域转换到另一个域,它通常有一个巨大的开关块或几个ifs,例如: private DomainB translateSomething(final DomainA data) { DomainB result = null; if (data != null) { if (CONSTANT_A_VALUE_X.equals(data)) { result = CONSTANT_B_VALU

我们有一些简短的方法可以将一些值从一个域转换到另一个域,它通常有一个巨大的
开关
块或几个
ifs
,例如:

private DomainB translateSomething(final DomainA data) {
    DomainB result = null;
    if (data != null) {
            if (CONSTANT_A_VALUE_X.equals(data)) {
                result = CONSTANT_B_VALUE_X;
            } else if (CONSTANT_A_VALUE_Y.equals(data)) {
                result = CONSTANT_B_VALUE_Y;
            } else if (CONSTANT_A_VALUE_Z.equals(data)) {
                result = CONSTANT_B_VALUE_Z;
            } else {
                result = CONSTANT_B_VALUE_W;
            }
    }
    return result;
}
它可能是一个
开关,而不是
if
,或者每个结果可能有多个条件,或者甚至在方法参数上接收多个域,以帮助确定单个结果,这就是为什么它不能是映射

当我看到这一点时,我对第一个条件应用短路,并移除所有
else
块,而不是将值赋给最终将返回的变量,我将返回放在条件本身内,产生以下代码:

private DomainB translateSomething(final DomainA data) {
    if (data == null) {
        return null;
    }
    if (CONSTANT_A_VALUE_X.equals(data)) {
        return CONSTANT_B_VALUE_X;
    }
    if (CONSTANT_A_VALUE_Y.equals(data)) {
        return CONSTANT_B_VALUE_Y;
    }
    if (CONSTANT_A_VALUE_Z.equals(data)) {
        return CONSTANT_B_VALUE_Z;
    }
    return CONSTANT_B_VALUE_W;
}
我已经做了好几次了,我知道IntelliJ对检查规则很有帮助,IntelliJ上有没有一些规则建议这样做?

您可以使用“将返回移到更接近值计算的位置…”快速修复与结果计算检查分离的“返回”(Java |代码风格问题|'返回'与结果计算分离),然后应用“删除冗余的'else'”快速修复冗余的'else'检查(Java |控制流问题|冗余的'else')


我意识到这并不是您所要求的,但另一种方法可能是为这些类型中的每一种提供自定义转换器。如果转换足够相似(它们看起来很相似,因为您所有的返回都是类型
DomainB
),您可以为转换器创建一个代码模板,并在需要时从该模板创建另一个。我已提高了这些模板的严重性,然后它开始按预期报告!