目前我知道的几种常量类的几种写法:

  • 接口常量
  • 类常量
  • 枚举常量

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
/**
* @param companyLevel {@link CompanyLevelConsts}
*/
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 tags

#Java