常量应该封装到常量类,常量接口,还是枚举类中?

前言
之前项目中响应前台的接口中会用到一些公共常量。这个时候就比较纠结,常量到底是封装到哪里比较好呢,因为以前写的很多代码不怎么规范,而且有时候常量用到的不算太多太集中,所以就哪里用到哪个类上去声明一个出来,这样虽然很方便,但是统一维护起来,项目做大了,有些时候你要引用一个你记得你明明声明过的常量,却找半天都找不到,而且后期需要对常量中的内容进行一些修改的时候,维护起来也十分不方便,代码整体结构也不优雅。所以自己决定研究一下到底常量应该封装到哪里比较好呢。因为题目所说的三种自己也都见过,但是具体的区别以及优劣却没有细细钻研。今天这里简单的记录整理一下,以防自己以后忘记。

示例代码
第一种使用接口:

public interface Constants{
  
    int AUDIT_STATUS_PASS = 1;
    int AUDIT_STATUS_NOT_PASS = 2;
}
第二种使用类:

public final class Constans{
  
    private Constans() {
    }
  
    public static final int AUDIT_STATUS_PASS = 1;
    public static final int AUDIT_STATUS_NOT_PASS = 2;
}
第三种使用枚举:

public enum Constants {
 
    AUDIT_STATUS_PASS(1),
    AUDIT_STATUS_NOT_PASS(2);
    
    private int status;
    
    private Constants(int status){
        this.setStatus(status);
    }
 
    public int getStatus() {
        return status;
    }
}
首先,前两种可以看成是一样的。第一种写起来更方便一些吧,省去了public static final字段。但是如果从细想,接口可以被继承,可以将内容深入到其实现类代码中。这样对于一个常量类接口来说显然是不合理,但是你确实无法规避这个问题。唯一可以解决的办法就是弃用常量接口,选用常量类的方式。以final字段修饰,防止其被继承。并将其构造函数private化,防止被实例化。这显然在硬性上可以很好地解决这个问题。

但即便如此枚举任然是首选,但是如果不使用枚举的话,在《Effective Java》一书中,作者建议使用一般类加私有构造函数的方式。但是参考了 StackOverFlow 上大牛的讲解,我认为一般类上也应该再加上final字段。这样可以更好的避免一些不必要的麻烦。

参考:Interfaces with static fields in java for sharing 'constants'

常量接口
你可能会问常量接口就真的一无是处吗?

也不是,但是和是也差不多。但是我还是会用,贴一段自己的代码

public final class Const {
 
    private Const() {
    }
 
    public static final String CURRENT_USER = "currentUser";
 
    // 这里没有使用interface进行分组是因为 这两个对象不好分组。
    public static final String EMAIL = "email";
    public static final String USERNAME = "username";
 
    // 普通用户和管理员是一个组,枚举过于繁重
    // 内部接口类 把常量进行分组。没有枚举重,但还可以分组,而且里面还是常量
    public interface Role {
        int ROLE_CUSTOMER = 0; // 普通用户
        int ROLE_ADMIN = 1; // 管理员
    }
}
具体常量接口的作用注释中已经写得很清楚了。总结下来就是前提你是内部接口,那么你可以直观分组,还简洁。

总结
综上:优先枚举,常量类,接口(不建议)。

————————————————

转自:https://blog.csdn.net/qq_28867949/article/details/79783808

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章