zxpnet网站 zxpnet网站
首页
前端
后端服务器
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

zxpnet

一个爱学习的java开发攻城狮
首页
前端
后端服务器
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 大后端课程视频归档
  • 南航面试题
  • 并发编程

  • 性能调优

  • java8语法

  • lombok

  • 日志

  • 工具类

  • spring

  • mybatis

  • springboot

  • redis

  • zookeeper

  • springcloud

  • dubbo

  • netty

  • springsecurity

  • mq消息中间件

  • shiro

  • beetle

  • 模板引擎

  • jpa

  • 数据结构与算法

  • 数据库知识与设计

  • gradle

  • maven

  • bus

  • 定时任务

  • docker

  • centos

  • 加解密

  • biz业务

    • 公共业务

      • 单例模式
      • Untitled
        • 常量
        • 常量定义的方式
          • 1、Interface定义常量方法:接口常量设计模式
          • 2、Class定义常量方法
          • 3、Enum定义常量
          • 4、通过配置文件来配置常量
        • 枚举高级用法
      • 接口与抽象类的应用(包括各自设计模式)
      • SpringBoot使用ApplicationEvent&Listener完成业务解耦
      • 业务异常处理
      • ThreadLocal用法
      • 自定义RequestMappingHandlerMapping实现程序版本控制
    • 商城系统

    • 许愿池

    • 微信公众号

    • 企业微信

    • 分销返利系统

  • pigx项目

  • 开源项目

  • 品达通用权限项目-黑马

  • 货币交易项目coin-尚学堂

  • php

  • backend
  • biz业务
  • 公共业务
shollin
2021-06-22
目录

Untitled

  • 常量
  • 常量定义的方式
    • 1、Interface定义常量方法:接口常量设计模式
    • 2、Class定义常量方法
    • 3、Enum定义常量
    • 4、通过配置文件来配置常量
  • 枚举高级用法

# 常量

常量不同于常量值,它可以在程序中用符号来代替常量值使用,因此在使用前必须先定义。常量与变量(在《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

常量有三种类型:静态常量、成员常量和局部常量。

代码第 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
  • 接口当中的常量,可以省略public static final,不管是写还是不写,实质都是一样的。

  • 接口中的常量,必须进行赋值,不能不赋值。

  • 接口中常量的名称,使用完全大写的字母,用下划线进行分隔(推荐)

# 2、Class定义常量方法

public class infos{
   public static final String MYNAME="zzz"; //定义中用了final,就是不能改变的。
}
1
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

# 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
/**
 * @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

参考文章:

Java中定义常量的几种方法 (opens new window)

单例模式
接口与抽象类的应用(包括各自设计模式)

← 单例模式 接口与抽象类的应用(包括各自设计模式)→

最近更新
01
国际象棋
09-15
02
成语
09-15
03
自然拼读
09-15
更多文章>
Theme by Vdoing | Copyright © 2019-2023 zxpnet | 粤ICP备14079330号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式