Magic Number问题的解决方案......?

Ruc*_*era 2 java magic-numbers switch-statement sonarqube

考虑以下代码段...

 public static UserStatus getEnum(int code) {
    switch (code) {
        case 0:
            return PENDING;
        case 1:
            return ACTIVE;
        case 2:
            return SUSPENDED;
        case 3:
            return DELETED;
        case 4:
            return LOGIN_DISABLED;
        default:
            return null;
        }

}
Run Code Online (Sandbox Code Playgroud)

现在,案件中的第3和第4(案例3和案例4)被SONAR检测为幻数.

为了避免这个问题,我改变了我的代码段如下...

 public static UserStatus getEnum(int code) {        
    final int Pending=0;
    final int Active=1;
    final int Suspended=2;
    final int Deleted= 3;
    final int Login_details=4;

    switch (code) {
        case Pending:
            return PENDING;
        case Active:
            return ACTIVE;
        case Suspended:
            return SUSPENDED;
        case Deleted:
            return DELETED;
        case Login_details:
            return LOGIN_DISABLED;
        default:
            return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是解决这种场景中神奇数字问题的好方法吗?

Ted*_*opp 7

我想你要避免在代码中使用整数文字.您的解决方案不是特别有效,因为它只是将文字移动到方法的顶部.它获得了一点点因为它为常量提供了有意义的名称,但这些名称对于该方法是私有的.

更好的方法是将数字定义为接口中的字段.然后,您可以静态导入字段并将其用作常量的符号名称.

如果枚举的声明顺序与常量相同:

enum UserStatus {PENDING, ACTIVE, SUSPENDED, DELETED, LOGIN_DISABLED}
Run Code Online (Sandbox Code Playgroud)

你可以做另一招:

public static UserStatus getEnum(int code) {
    UserStatus[] values = UserStatus.values();
    return (code >= 0 && code < values.length) ? values[code] : null;
}
Run Code Online (Sandbox Code Playgroud)

但是,这会在常量值和枚举声明之间建立联系.这可能没问题,具体取决于调用时生成实际参数值的位置getEnum.