前言
之前项目中响应前台的接口中会用到一些公共常量。这个时候就比较纠结,常量到底是封装到哪里比较好呢,因为以前写的很多代码不怎么规范,而且有时候常量用到的不算太多太集中,所以就哪里用到哪个类上去声明一个出来,这样虽然很方便,但是统一维护起来,项目做大了,有些时候你要引用一个你记得你明明声明过的常量,却找半天都找不到,而且后期需要对常量中的内容进行一些修改的时候,维护起来也十分不方便,代码整体结构也不优雅。所以自己决定研究一下到底常量应该封装到哪里比较好呢。因为题目所说的三种自己也都见过,但是具体的区别以及优劣却没有细细钻研。今天这里简单的记录整理一下,以防自己以后忘记。
示例代码
第一种使用接口:
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; // 管理员
}
}
具体常量接口的作用注释中已经写得很清楚了。总结下来就是前提你是内部接口,那么你可以直观分组,还简洁。
总结
综上:优先枚举,常量类,接口(不建议)。