Java里魔法值的处理方案?

在项目里经常会定义很多状态,比如对于查询状态:
1是查询中 2是已完成 3是已失败
应该基本上不会有啥变动了
像这种数字字符串直接出现在代码里一是突兀 二是容易让人不知所云
以前偷懒的做法就是直接写个注释一走了之了
现在觉得还是得解决一下这些魔法值
看了一些做法比如提取到类的静态常量
有的是在方法里直接定义变量
还有的说提取到一个专门放静态常量的类里,或者枚举类..
这几种做法哪种是比较好的,利弊是什么?或者有更好的解决方法?

阅读 2.6k
2 个回答

不推荐定义常量:
直接在类中定义一个常量,这种方法对于魔法值的使用范围只在一个类的范围内的情况下比较方便

public final static STATUS_FALSE=0;
public final static STATUS_TRUE=1;

定义在实体类:
这样写是比较推荐的,你可以在任意想用的地方使用类名打点的方式使用这些常量。如果要写的常量比较多也可以直接建一个专门用来存放静态常量的类。

public class user{
private String name;
private Integer status;
public final static STATUS_FALSE=0;
public final static STATUS_TRUE=1;
}

在接口中定义


public interface UserService{
public final static STATUS_FALSE=0;
public final static STATUS_TRUE=1;
}

写在接口中的话好处就是,继承这个接口的实现类都可以使用这些常量。

当然也可以用枚举值

具体用那种看你的需求了

推荐使用枚举,可以表示一个范围的常量集合。如果有地方用不了枚举的时候可以放常量里面,再用枚举管理。

@Getter
@AllArgsConstructor
public enum YesNoEnum {

    YES("1", "是"),
    NO("0", "否"),;



    public String value;
    public String text;

    private static final Map<String, YesNoEnum> mappings;
    static {
        mappings = Collections.unmodifiableMap(Arrays.stream(values()).collect(Collectors.toMap(YesNoEnum::getValue, Function.identity())));
    }

    public static YesNoEnum resolve(String value) {
        return mappings.get(value);
    }

    public static boolean containsKey(String value) {
        return mappings.containsKey(value);
    }
}

单独的可以写在常量类里面。

public class Constants
{
    /**
     * UTF-8 字符集
     */
    public static final String UTF8 = "UTF-8";

    /**
     * GBK 字符集
     */
    public static final String GBK = "GBK";
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏