在开发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架构篇之常量管理(枚举定义法)”
架构观点:不一定越高级的方法越好,高级的方法在提高自己扩展性的同时,也会带来一定工作量,适用自己项目的方法才是最好的方法