目前我知道的几种常量类的几种写法:
1、接口常量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public interface BranchLevelConsts {
String HEAD_OFFICE = "1";
String PROVINCE = "2";
String CITY = "3";
String COUNTY = "4"; }
|
优点:
- 少去了写
public static final
的时间
缺点:
2、类常量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public final class CompanyLevelConsts { private CompanyLevelConsts() { }
public static final String HEAD_OFFICE = "1";
public static final String PROVINCE = "2";
public static final String CITY = "3";
public static final String COUNTY = "4"; }
|
优点:
- 类声明为
final
,不会被其他类继承
- 私有构造方法,不会被
new
上面的这种写法,类只有一个无参构造器且该构造器是私有的,不会被外部类调用。可以省略类上声明的表示该类不可被继承的 final
修饰符,因为如果类继承了另外一个类,则会调用其父类的构造方法,因父类构造方法为私有的,所以会出现编译错误。
3、枚举常量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| @Getter @RequiredArgsConstructor enum ErrorCodeEnum { SUCCESS("00000", "成功"),
CLIENT_ERROR("A0001", "用户端错误"),
SERVER_ERROR("B0001", "系统执行出错"),
OTHER_SERVER_ERROR("C0001", "调用第三方服务出错"),
CUSTOM_ERROR("Y", "自定义错误"),
UNKNOWN("Z0000", "未知错误") ; private final String code; private final String message; }
|
3.1 优点
3.1.1 可以定义多个属性
上面的枚举中,定义的状态码,有码值还有中文描述。比如在规范化的响应中,需要返回两个字段,分别是状态码和状态描述,就可以从枚举中获取码值和对应的描述
1 2
| responseMessage.setCode(ErrorCodeEnum.SUCCESS.getCode()); responseMessage.setContent(ErrorCodeEnum.SUCCESS.getMessage());
|
3.1.2 限制方法参数
方法参数需要用常量值作为参数,如果使用常量类,那参数类型为 String
等,不会对参数的值进行约束。
1 2 3 4 5 6 7 8 9 10 11
|
public void queryUserByCompanyLevel(QueryUserCondDTO dto, String companyLevel) { }
void test(QueryUserCondDTO dto) { this.queryUserByCompanyLevel(dto, "4396"); }
|
使用枚举的话,可以对方法调用方传进来的值做约束。
1 2 3 4 5 6 7 8
| public void queryUserByCompanyLevel(QueryUserCondDTO dto, CompanyLevelEnum companyLevel) { }
void test(QueryUserCondDTO dto) { this.queryUserByCompanyLevel(dto, CompanyLevelEnum.PROVINCE); }
|
相关链接
OB links
#Java