在开发java代码的时候往往会遇到很多常量,可能会出现以下内容的代码
switch (userType){
case 1:
//1是管理员
//to do something
break;
case 2:
//2是普通会员
//to do something
break;
case 3:
//3是游客
//to do something
break;
}
判断用户的类型,不同的用户类型做不同的处理,这里面有注释,所以能看懂写的是什么,如果没有注释,你需要去看其他代码或者资料分清楚这个userType有几种类型,分表代表什么含义,严重降低开发效率,但这又是平时开发中是经常看到的。
下面跟着我一步一步提升代码质量
上面的示例代码中,在CheckStyle(这个东西写java的都应该要了解)规范中,这种写法也是会报Magic Number警告的,在此规范中,只有0和1等可以直接写数值,其他数值的定义都要提到类里面作为静态成员变量。类似于下面这样的代码
public class Codetest {
private static final int ADMIN = 1;
private static final int USER = 2;
private static final int VISITOR = 3;
public static void main(String[] args) {
int userType = ADMIN;
switch (userType) {
case ADMIN:
//to do something
break;
case USER:
//to do something
break;
case VISITOR:
//to do something
break;
}
}
}
怎么样,这样即使没有注释,你是不是也能看懂一些了,对应英文翻译一下就知道常量代表的含义了,这样checkstyle也不会报MagicNumber 的警告了。
但是,要是不同的类都需要使用相同的变量的怎么办,相同的常量定义不可能每个类里面都定义一遍,那样重复代码太多,于是就把所有的常量集中在一起,单独定义一个常量类,于是便有了以下的代码
public class Constant {
public static final int ADMIN = 1;
public static final int USER = 2;
public static final int VISITOR = 3;
}
这样,需要用常量的话使用这个类就好了
但是,代码依然可以进行优化,因为在这和类里面出现了大量的public static final的代码,我们可以通过其他方式,来避免大量这样的定义,这种方式,就是使用接口的方式。
public interface CodeConstant {
/**
* 用户类型
*/
interface USER_TYPE{
int ADMIN = 1;
int USER = 2;
int VISITOR = 3;
}
/**
* 用户登录状态
*/
interface USER_STATUS{
int LOGIN = 1;
int LOGOUT = 2;
}
}
可以注意到,大量的public static final不见了
原理:在接口里面定义属性,会自动加上public static final
在我们用的时候,就可以这么调用了~~
import cn.infol.service.webclient.rest.CodeConstant.USER_TYPE;
public class Codetest {
public static void main(String[] args) {
int userType = USER_TYPE.USER;
switch (userType) {
case USER_TYPE.ADMIN:
//to do something
break;
case USER_TYPE.USER:
//to do something
break;
case USER_TYPE.VISITOR:
//to do something
break;
}
}
}
这种优点显而易见,可以很方便的定义常量,并且常量是可以分层次结构的
在应对一般的系统开发,这种常量的定义方法已经能够满足我们的需求了。
如果你的项目比较大,业务逻辑比较复杂,会对常量有些特殊操作,比如说:你需要找到这个USER_TYPE常量类别下有几种类型的常量,这时候,接口定义法不太适用了,可以参照我的下一篇 “java架构篇之常量管理(枚举定义法)”
架构观点:不一定越高级的方法越好,高级的方法在提高自己扩展性的同时,也会带来一定工作量,适用自己项目的方法才是最好的方法