Untitled
# 常量
常量不同于常量值,它可以在程序中用符号来代替常量值使用,因此在使用前必须先定义。常量与变量(在《Java变量的声明和初始化 (opens new window)》一节中讲解)类似也需要初始化,即在声明常量的同时要赋予一个初始值。常量一旦初始化就不可以被修改。Java 语言使用 final 关键字来定义一个常量,其语法如下所示:
final dataType variableName = value
1
其中,final
是定义常量的关键字,dataType 指明常量的数据类型,variableName 是变量的名称,value 是初始值。
final 关键字表示最终的,它可以修改很多元素,修饰变量就变成了常量。例如,以下语句使用 final 关键字声明常量。
public class HelloWorld {
// 静态常量
public static final double PI = 3.14;
// 声明成员常量
final int y = 10;
public static void main(String[] args) {
// 声明局部常量
final double x = 3.3;
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
常量有三种类型:静态常量
、成员常量
和局部常量
。
代码第 3 行的是声明静态常量,使用在 final 之前 public static 修饰。public static
修饰的常量作用域是全局的,不需要创建对象就可以访问它,在类外部访问形式为 HelloWorld. PI。这种常量在编程中使用很多。
代码第 5 行声明成员常量,作用域类似于成员变量,但不能修改。代码第 9 行声明局部常量,作用域类似于局部变量,但不能修改。
在定义常量时,需要注意如下内容:
- 在定义常量时就需要对该常量进行初始化。
- final 关键字不仅可以用来修饰基本数据类型的常量,还可以用来修饰对象的引用或者方法。
- 为了与变量区别,常量取名一般都用大写字符。
# 常量定义的方式
# 1、Interface定义常量方法:接口常量设计模式
public interface SomeConstants {
String IP = "166.111.16.1";
}
1
2
3
2
3
接口当中的常量,可以省略public static final,不管是写还是不写,实质都是一样的。
接口中的常量,必须进行赋值,不能不赋值。
接口中常量的名称,使用完全大写的字母,用下划线进行分隔(推荐)
# 2、Class定义常量方法
public class infos{
public static final String MYNAME="zzz"; //定义中用了final,就是不能改变的。
}
1
2
3
2
3
interface
中定义常量方法生成的class
文件比第一种方法的更小
- interface 没有继承 Object,Object 是所有类的基类,所以 interface 不是类。 Java 在编译之后会在字节码文件中生成
方法,称之为实例构造器,该实例构造器会将语句块,变量初始化,调用父类的构造器等操作收敛到 方法中。 并且接口中也没有 ,因为当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化,必然会调用 ,况且接口也不能初始化
# 3、Enum定义常量
@Getter
public enum Status implements IStatus {
/**
* 操作成功!
*/
SUCCESS(200, "操作成功!"),
/**
* 操作异常!
*/
ERROR(500, "操作异常!"),
/**
* 状态码
*/
private Integer code;
/**
* 返回信息
*/
private String message;
Status(Integer code, String message) {
this.code = code;
this.message = message;
}
public static Status fromCode(Integer code) {
Status[] statuses = Status.values();
for (Status status : statuses) {
if (status.getCode()
.equals(code)) {
return status;
}
}
return SUCCESS;
}
@Override
public String toString() {
return String.format(" Status:{code=%s, message=%s} ", getCode(), getMessage());
}
}
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
39
40
41
42
43
44
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
39
40
41
42
43
44
# 4、通过配置文件来配置常量
# 枚举高级用法
实现接口或者继承抽象类,实现错误、异常的规范返回
/**
* roses异常规范
*
* @author fengshuonan
* @date 2017-12-17-下午10:22
*/
public interface AbstractBaseExceptionEnum {
/**
* 获取异常的状态码
*/
Integer getCode();
/**
* 获取异常的提示信息
*/
String getMessage();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* @author fengshuonan
* @Description 所有业务异常的枚举
* @date 2016年11月12日 下午5:04:51
*/
public enum BizExceptionEnum implements AbstractBaseExceptionEnum {
/**
* 字典
*/
DICT_EXISTED(400, "字典已经存在"),
ERROR_CREATE_DICT(500, "创建字典失败"),
ERROR_WRAPPER_FIELD(500, "包装字典属性失败"),
ERROR_CODE_EMPTY(500, "字典类型不能为空"),
/**
* 文件上传
*/
FILE_READING_ERROR(400, "FILE_READING_ERROR!"),
FILE_NOT_FOUND(400, "FILE_NOT_FOUND!"),
UPLOAD_ERROR(500, "上传图片出错"),
/**
* 权限和数据问题
*/
DB_RESOURCE_NULL(400, "数据库中没有该资源"),
NO_PERMITION(405, "权限异常"),
REQUEST_INVALIDATE(400, "请求数据格式不正确"),
INVALID_KAPTCHA(400, "验证码不正确"),
CANT_DELETE_ADMIN(600, "不能删除超级管理员"),
CANT_FREEZE_ADMIN(600, "不能冻结超级管理员"),
CANT_CHANGE_ADMIN(600, "不能修改超级管理员角色"),
/**
* 账户问题
*/
NOT_LOGIN(401, "当前用户未登录"),
USER_ALREADY_REG(401, "该用户已经注册"),
NO_THIS_USER(400, "没有此用户"),
USER_NOT_EXISTED(400, "没有此用户"),
ACCOUNT_FREEZED(401, "账号被冻结"),
OLD_PWD_NOT_RIGHT(402, "原密码不正确"),
TWO_PWD_NOT_MATCH(405, "两次输入密码不一致"),
/**
* 错误的请求
*/
MENU_PCODE_COINCIDENCE(400, "菜单编号和副编号不能一致"),
EXISTED_THE_MENU(400, "菜单编号重复,不能添加"),
DICT_MUST_BE_NUMBER(400, "字典的值必须为数字"),
REQUEST_NULL(400, "请求有错误"),
SESSION_TIMEOUT(400, "会话超时"),
SERVER_ERROR(500, "服务器异常"),
/**
* token异常
*/
TOKEN_EXPIRED(700, "token过期"),
TOKEN_ERROR(700, "token验证失败"),
/**
* 签名异常
*/
SIGN_ERROR(700, "签名验证失败"),
/**
* 系统常量
*/
ALREADY_CONSTANTS_ERROR(400, "已经存在该编码的系统参数"),
SYSTEM_CONSTANT_ERROR(400, "不能删除系统常量"),
/**
* 其他
*/
AUTH_REQUEST_ERROR(400, "账号密码错误"),
/**
* ueditor相关异常
*/
UE_CONFIG_ERROR(800, "读取ueditor配置失败"),
UE_FILE_NULL_ERROR(801, "上传文件为空"),
UE_FILE_READ_ERROR(803, "读取文件错误"),
UE_FILE_SAVE_ERROR(802, "保存ue的上传文件出错"),
/**
* 工作流相关
*/
ACT_NO_FLOW(900, "无可用流程,请先导入或新建流程"),
ACT_ADD_ERROR(901, "新建流程错误"),
/**
* 租户相关的异常
*/
NO_TENANT_ERROR(1901, "没有相关租户");
BizExceptionEnum(int code, String message) {
this.code = code;
this.message = message;
}
private Integer code;
private String message;
@Override
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
参考文章: