【实际开发12】- Utils / tools

目录

1. 自定义工具类 概念 / 解析

1. 构建方式

1. XxxClassl 类 public xxx() → new XxxClass()

2. XxxClassl 类 public static xxx() → XxxClass.xxx()

2. Interface

1. public interface XxxMapper → private final XxxMapper

2. public interface IXxxService → private final IXxxService

3. 获取任意泛型类的某个属性

2. 自定义工具类注意事项 ( 踩坑 )

1. 待定

3. 通用工具类

1. 时间 : 入参格式校验

0. LocalDateTime 用法 - 详参 : LocalDateTime用法_微风粼粼的博客-CSDN博客

1. format.parse() - Java 8 新添 API 用于 : 解析日期 和 时间

2. LocalDateTime.parse(date , dtf);

3. LocalDateTime - 实体类层直接拦截 , 未进入 Impl 业务层

4. LocalDateTime 局部格式化

2. 罗马数字 与 阿拉伯数字 互转

1. RomeToArabic.java

3. 字符串 切割

1. ResultHandler.AIPredictResultHandler.java

4. 获取随机数

4. 全局 · 常量的维护 ( 项目级 )

1. interface 接口

1. CommonConstants.java

2. enum

1. BusinessEnum.java

2. StructureEnumConstants.java

3. Class 定义常量

4. interface 里定义 interface ( 为了减少接口的定义 , 同时将常量分类 )

5. 常量和枚举的区别


1. 自定义工具类 概念 / 解析


1. 构建方式

认知:

1、参数传递 ,BaseMapper

2、泛型

3、static ( 可以使用 static 静态方法将调用简化,也可以使用 private 的方法私有化,让别人不可以随机调用对象 )

原始:

public class EnhancedCode<T> {

	@Autowired
	BaseMapper baseMapper;

    // 校验:资源是否存在
    public void checkResource(Integer id){
        Object object = baseMapper.selectById(id);
        if(null == object){
            throw new RuntimeException("参数:" + id + ",对应资源不存在,请核实后输入");
        }
    }

}
 public class EnhancedCode<T extends BaseMapper> {

	@Autowired
	BaseMapper baseMapper;

    // 校验:资源是否存在
    public void checkResource(Integer id){
        Object object = baseMapper.selectById(id);
        if(null == object){
            throw new RuntimeException("参数:" + id + ",对应资源不存在,请核实后输入");
        }
    }

}


1. XxxClassl 类 public xxx() → new XxxClass()

public class EnhancedCode<T extends BaseMapper> {

    // @Autowired
    // BaseMapper baseMapper;

    // 校验:资源是否存在
    public void checkResource(Integer id , BaseMapper baseMapper){
        Object object = baseMapper.selectById(id);
        if(null == object){
            throw new RuntimeException("参数:" + id + ",对应资源不存在,请核实后输入");
        }
    }

}

BaseMapper baseMapper; 依赖抽模,存在工具类与业务层具体实现的 XxxServiceImpl 里 XxxMapper 不一致的问题

导致最终无法实现期望结果

    @Override
    public Boolean deleteIotCashTransfer(Integer id) {
        // 校验:资源是否存在
        EnhancedCode<IotCashTransferMapper> enhancedCode = new EnhancedCode<>();
        enhancedCode.checkResource(id ,iotCashTransferMapper);
        this.removeById(id);
        return Boolean.TRUE;
    }


2. XxxClassl 类 public static xxx() → XxxClass.xxx()

静态方法,直接使用,不需要 new

public class EnhancedCode{

    // @Autowired
    // BaseMapper baseMapper;

    // 校验:资源是否存在
    public static void checkResource(Integer id ,BaseMapper baseMapper){
        Object obj = baseMapper.selectById(id);
        if(null == obj){
            throw new RuntimeException("参数:" + id + ",对应资源不存在,请核实后输入");
        }
    }
    
}
    @Override
    public Boolean deleteIotCashTransfer(Integer id) {
        // 校验:资源是否存在
        // EnhancedCode<IotCashTransferMapper> enhancedCode = new EnhancedCode<>();
        // enhancedCode.checkResource(id ,iotCashTransferMapper);
        EnhancedCode.checkResource(id,baseMapper);
        this.removeById(id);
        return Boolean.TRUE;
    }


2. Interface


1. public interface XxxMapper → private final XxxMapper


2. public interface IXxxService → private final IXxxService


3. 获取任意泛型类的某个属性

参考:

java在泛型类 T 上利用反射取属性值 - 雪化山河 - 博客园 java在泛型类 T 上利用反射取属性值

获取任意泛型类的某个属性_shunfengshunshui_的博客-CSDN博客_获取范类型的属性 获取任意泛型类的某个属性

mybatis-plus实现 相似实体类使用泛型操作同样的逻辑代码更新保存修改的方法_sgambler的博客-CSDN博客_mybatisplus 泛型 mybatis-plus 实现 相似实体类使用泛型操作同样的逻辑代码更新保存修改的方法


2. 自定义工具类注意事项 ( 踩坑 )


1. 待定


3. 通用工具类


1. 时间 : 入参格式校验


0. LocalDateTime 用法 - 详参 : LocalDateTime用法_微风粼粼的博客-CSDN博客

详参 :

JDK1.8 中 LocalDateTime 时间格式化两种方案_北冥的鱼_修行的博客-CSDN博客_localdatetime 格式化


1. format.parse() - Java 8 新添 API 用于 : 解析日期 和 时间

package com.hzcloud.iot.resource.utils;

/**
* @Author:menghuan
* @Date:2020/9/28 11:58
*/

import org.junit.jupiter.api.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;


public class isValidDate{

    /**
     * 验证日期格式是否满足要求
     * @param str          需要验证的日期格式
     * @param formatString 验证的标准格式 , 如:(yyyy/MM/dd HH:mm:ss)
     * @return 返回验证结果
     */
    public static boolean isValidDate(String str ,  String formatString) {
        // 指定日期格式 , 注意yyyy/MM/dd区分大小写;
        SimpleDateFormat format = new SimpleDateFormat(formatString);
        try {
            // 设置lenient为false.
            // 否则SimpleDateFormat会比较宽松地验证日期 , 比如2007/02/29会被接受 , 并转换成2007/03/01
            format.setLenient(false);
            format.parse(str);
        } catch (ParseException e) {
            // e.printStackTrace();
            // 如果throw java.text.ParseException或者NullPointerException , 就说明格式不对
            return false;
        }
        return true;
    }

    @Test
    public void test1(){
        String str = "2020-08-22 16:04:00";
        String formatString = "yyyy-MM-dd HH:mm:ss";
        boolean validDate = isValidDate(str ,  formatString);
        System.out.println(validDate);

    }
}
        //时间参数校验
        boolean checkStartTime = isValidDate.ValidDate(iotContractDTO.getStartTime().toString() ,  "yyyy-MM-dd HH:mm:ss");
        if(!checkStartTime){
            throw new IotContractException(iotContractDTO.getStartTime() + "时间格式异常 , 请核实后输入");
        }
        boolean checkEndTime = isValidDate.ValidDate(iotContractDTO.getEndTime().toString() ,  "yyyy-MM-dd HH:mm:ss");
        if(!checkEndTime){
            throw new IotContractException(iotContractDTO.getEndTime() + "时间格式异常 , 请核实后输入");
        }


2. LocalDateTime.parse(date , dtf);

package com.tsy.repository.utils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @description 校验时间格式
 * @Author: menghuan
 * @Date: 2021/1/5 17:08
 */
public class IsDateVail {

    /**
     * 校验时间格式是否为 yyyy-MM-dd HH:mm:ss
     * @param date
     * @return
     */
    private static final String PATTERN_DEFAULT = "yyyy-MM-dd HH:mm:ss";

    public static Boolean isDateVail(String date) {
        //用于指定 日期/时间 模式
        // DateTimeFormatter dtf = DateTimeFormatter.ofPattern(DateTimeUtil.PATTERN_DEFAULT);
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(PATTERN_DEFAULT);
        boolean flag = true;
        try {
            //Java 8 新添API 用于解析日期和时间
            LocalDateTime.parse(date ,  dtf);
        } catch (Exception e) {
            flag = false;
        }
        return flag;
    }

    public static void main(String[] args) {
        Boolean dateVail = IsDateVail.isDateVail("2021-01-05 12:00:00");
        System.out.println(dateVail);
    }

}


3. LocalDateTime - 实体类层直接拦截 , 未进入 Impl 业务层

@ApiModelProperty(value = "生效时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,  timezone = "GMT+8")
@NotBlank(message = "合约生效时间[startTime]不能为空"  , groups = {Save.class})
private LocalDateTime startTime;

@ApiModelProperty(value = "截止时间")
@NotBlank(message = "合约截止时间[endTime]不能为空"  , groups = {Save.class})
private LocalDateTime endTime;
{
    "code": 1 , 
    "msg": "JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String \"2020-08-23 16:04\": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2020-08-23 16:04' could not be parsed at index 16; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime` from String \"2020-08-23 16:04\": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2020-08-23 16:04' could not be parsed at index 16\n at [Source: (PushbackInputStream); line: 9 ,  column: 16] (through reference chain: com.hzcloud.iot.contract.dto.IotContractDTO[\"endTime\"])" , 
    "data": null
}

4. LocalDateTime 局部格式化

    // 声明需要格式化的格式(日期加时间)
    DateTimeFormatter dfDateTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    // 将当前日期进行格式化
    String format = dfDateTime.format(LocalDateTime.now());

简化

    // 将当前日期进行格式化
    String format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
    System.out.printf("Consumer Started: %s %n", format);

LocalDateTime.now() 默认输出格式 : 2021-01-05T12:00

LocalDateTime 在 GMT+8 默认格式为 yyyy-MM-ddTHH:mm:ss , 如 2021-01-01T10:15:12

比如需要格式化为 : yyyy-MM-dd HH:mm:ss


2. 罗马数字 与 阿拉伯数字 互转


1. RomeToArabic.java

package com.tsy.repository.utils;

/**
 * @Author:menghuan
 * @Date:2020/12/22 15:47
 */


import java.util.Scanner;

/**
 * 请编写程序 , 由用户输入若干个罗马数字串 , 程序输出对应的十进制表示。
 * <p>
 * 输入格式是:第一行是整数n , 表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。
 * <p>
 * 要求程序输出n行 , 就是罗马数字对应的十进制数据。
 * <p>
 * 例如 , 用户输入: 3 LXXX XCIII DCCII
 * <p>
 * 则程序应该输出: 80 93 702
 *
 * @author Administrator
 */
public class RomeToArabic {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("程序员之家测试结果:");
        Scanner mScanner = new Scanner(System.in);
        System.out.println(r2a(mScanner.nextLine()));
        System.out.println(a2r(mScanner.nextInt()));
    }

    /**
     * 把罗马数字转换为阿拉伯数字
     * @param String m
     * @return int sum
     */
    public static int r2a(String m) {
        int[] graph = new int[400];
        graph['I'] = 1;
        graph['V'] = 5;
        graph['X'] = 10;
        graph['L'] = 50;
        graph['C'] = 100;
        graph['D'] = 500;
        graph['M'] = 1000;
        char[] num = m.toCharArray();
        int sum = graph[num[0]];
        for (int i = 0; i < num.length - 1; i++) {
            if (graph[num[i]] >= graph[num[i + 1]]) {
                sum += graph[num[i + 1]];
            } else {
                sum = sum + graph[num[i + 1]] - 2 * graph[num[i]];
            }
        }
        return sum;
    }

    /**
     * 把阿拉伯数字转换为罗马数字
     * @param int number
     * @return String
     */
    public static String a2r(int number) {
        String rNumber = "";
        int[] aArray = {1000 ,  900 ,  500 ,  400 ,  100 ,  90 ,  50 ,  40 ,  10 ,  9 ,  5 ,  4 ,  1};
        String[] rArray = {"M" ,  "CM" ,  "D" ,  "CD" ,  "C" ,  "XC" ,  "L" ,  "XL" ,  "X" , 
                "IX" ,  "V" ,  "IV" ,  "I"};
        if (number < 1 || number > 3999) {
            rNumber = "-1";
        } else {
            for (int i = 0; i < aArray.length; i++) {
                while (number >= aArray[i]) {
                    rNumber += rArray[i];
                    number -= aArray[i];
                }
            }
        }
        return rNumber;
    }
}


3. 字符串 切割


1. ResultHandler.AIPredictResultHandler.java

/**
 * @Author: menghuan
 * @Date: 2021/10/20 17:19
 */
public class ResultHandler {

    public static String AIPredictResultHandler(String var){
        String substring = var.substring(var.indexOf("[") + 1, var.lastIndexOf("]"));
        System.out.println(substring);
        return substring;
    }

    public static void main(String[] args) {
        String varR = "+I[26.004128914434695]";
        AIPredictResultHandler(varR);
    }

}


4. 获取随机数


4. 全局 · 常量的维护 ( 项目级 )

编程中使用常量的优点:

常量提取出来有利于代码阅读,而且下次再做这种判断不用手写或复制并且提高代码的复用率,方便修改,直接通过常量类就能得到。

不过我觉得提取出来并不会有利于代码性能提升,因为常量分配在内存的常亮池中,所以内存不会出现多个相同常量字符串。

总的来说提取常量主要是为了 :避免魔法数字和硬编码等,提高代码的可读性。


1. interface 接口

使用 interface 来定义一个接口。

接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。

定义接口的基本格式如下:

[修饰符] interface 接口名 [extends 父接口名列表]{
    [public] [static] [final] 常量;  
    //全局常量
    [public] [abstract] 方法;  
    //抽象方法
}

修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限。

接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。

extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。

方法:接口中的方法只有定义而没有被实现。

public abstract void eat(); //接口中只能定义抽象方法

void eat(); //接口中定义的方法没有声明修饰符,默认为 public abstract

public static final int NUM = 10; //在接口中定义一个常量

int NUM = 10; //常量

接口之间可以多继承(注意:类是只能单继承)

具体类实现接口必须实现接口的所有方法

接口的概念 :

1.接口是一组行为的规范、定义,没有实现(JDK1.8默认方法)

2.使用接口,可以让我们的程序更加利于变化

3.接口是面向对象编程体系中的思想精髓之一

4.面向对象设计法则:基于接口编程

接口的使用规则 :

(1)定义一个接口,使用 interface 关键字;

(2)在一个接口中,只能定义常量、抽象方法,JDK1.8 后可以定义默认的实现方法;

(3)接口可以继承多个接口,extends xxx,xxx;

(4)一个具体类实现接口使用 inplements 关键字;

(5)一个类可以实现多个接口;

(6)抽象实现接口可以不实现接口的方法;

(7)在接口中定义的方法没有声明访问修饰符,默认为 public;

(8)接口不能有构造方法;

(9)接口不能被实例化。


1. CommonConstants.java

public interface CommonConstants {
    String TENANT_ID = "TENANT-ID";
    String AUTHORIZATION = "Authorization";
    String VERSION = "VERSION";
    Integer TENANT_ID_1 = 1;
    String STATUS_DEL = "1";
    String STATUS_NORMAL = "0";
    String STATUS_LOCK = "9";
    String MENU = "0";
    Integer MENU_TREE_ROOT_ID = 0;
    String UTF8 = "UTF-8";
    String FRONT_END_PROJECT = "iot-ui";
    String BACK_END_PROJECT = "iot";
    String DEFAULT_CODE_KEY = "DEFAULT_CODE_KEY_";
    String IOT_PUBLIC_PARAM_KEY = "IOT_PUBLIC_PARAM_KEY";
    Integer SUCCESS = 0;
    Integer FAIL = 1;
    String BUCKET_NAME = "iot";
    String RESOURCE_NOT_EXIST = "相应资源不存在,请核实后操作";
    String NAME_ALREADY_EXISTS = "名称已存在,请核实后操作";
    String PAY_SUBJECT = "支付服务";
    String REFUND_SUBJECT = "退款服务";
    String MEETING_STATUS_CODE_0 = "0";
    String MEETING_STATUS_CODE_1 = "1";
    String MEETING_STATUS_CODE_2 = "2";
    String MEETING_STATUS_CODE_3 = "3";
    String MEETING_STATUS_CODE_4 = "4";
    String MEETING_STATUS_CODE_5 = "5";
    String MEETING_STATUS_CODE_6 = "6";
    String MEETING_STATUS_CODE_7 = "7";
    String MEETING_STATUS_CODE_8 = "8";
    String MEETING_STATUS_CODE_9 = "9";

    public interface PAY_TYPE {
        String ALIPAY = "alipay";
        String WECHATPAY = "wechat";
    }

    public interface Language {
        String ZH = "0";
        String EN = "1";
    }
}

interface 里 interface 的应用

    @Override
    public Boolean deleteIotStructureModel(Integer id) {
        
        String alipay = CommonConstants.PAY_TYPE.ALIPAY;

        // 校验:资源是否存在
        IotStructureModel iotStructureModel = baseMapper.selectById(id);
        if (null == iotStructureModel) {
            throw new IotAssetStructureException(CommonConstants.RESOURCE_NOT_EXIST);
        }
        // 业务逻辑
        this.removeById(id);
        return Boolean.TRUE;
    }


2. enum


1. BusinessEnum.java

package com.linksame.iot.common.core.constant.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * @Classname BusinessEnum
 * @Description 业务枚举
 * @Date 2019/11/11 10:11
 * @Created by DZL
 */
@Getter
@AllArgsConstructor
public enum BusinessEnum {

    /**
     * 参数校验 101-199
     */
    PARAMETER_NULL(101, "参数不能为空"),
    ADD_FAIL(102, "新增失败"),
    UPDATE_FAIL(103, "修改失败"),
    DELETE_FAIL(104, "删除失败"),
    REVIEW_FAIL(105, "审核失败"),
    DATA_NULL(106, "获取数据为空"),
    PARAMETER_ID_NULL(107, "参数ID不能为空"),
    ILLEGAL_PARAMETER(108, "参数非法"),
    SUBMIT_REPEAT(109, "点击太快了,请勿重复提交"),
    QRCODE_NULL(110, "二维码生成为空"),
    TOKEN_ILLEGAL(111, "Token传参错误!"),

    /*授权枚举 200-998*/
    AUTH_HEADER_FAIL(200, "请求头携带参数不符合规范!"),
    AUTH_ACCOUNT_LOGIN_FAIL(201, "账号或密码输入错误!"),

    /*国际化语言*/
    LANGUAGE_NULL(999, "获取目标语言为空"),

    /*菜单枚举  1001-1099*/
    MENU_SAVE(1001, "非系统菜单不可新增"),
    MENU_DELET(1002, "非系统菜单不可删除"),
    MENU_UPDATE(1001, "非系统菜单不可修改"),
    MENU(1099, "系统菜单"),

    /*功能枚举 1101-1199*/
    FUNCTION_DELET(1101, "该功能占用,无法删除!!!"),
    BIND_NOT_DISABLE(1102,"存在关联业务, 无法禁用"),

    /*角色枚举 1201-1299*/
    ROLE_DELET(1201, "该角色已有用户占用,不允许删除"),
    ROLE_CODE_IS_NOT_NULL(1202,"角色code不允许为空"),
    ROLE_SYSTEM_PRESET_UPDATE(1203,"系统预置角色不允许修改"),
    ROLE_SYSTEM_PRESET_DELETE(1204,"系统预置角色不允许删除"),
    ROLE_SYSTEM_PRESET_DISABLE(1204,"系统预置角色不允许禁用"),
    ROLE_NAME_EXISTS(1205,"角色名称已存在"),
    ROLE_ID_NO_EXISTS(1205,"角色id不存在"),

    CLIENT_ID_EXIST(1351, "终端编号已存在,请重新填写"),
    SOCIAL_TYPE_EXIST(1361, "社交类型已存在,请选择其他类型"),
    SOCIAL_NOT_EXIST(1362, "该微信的社交类型标识不存在"),

    /* 账号/用户 2000-2099*/
    USER_IS_LOCK(2000, "该账号已被锁定"),
    USER_IS_EXIST(2001,"该账号已被注册,请重新输入"),
    ADMIN_USER_NULL(2002,"未查询到匹配的账号信息"),
    OLD_PASSWORD_IS_FAIL(2003,"原密码错误,修改失败"),
    ADMIN_USERINFO_NULL(2004, "未查询到匹配的用户信息"),
    ADMIN_TENANT_NULL(2005,"未查询到匹配的租户信息"),
    TENANT_NOT_IS_NULL(2007,"租户ID不允许为空"),
    USER_IDCODE_IS_EXIST(2008,"系统中已存在该身份证号, 请核对后再提交"),
    USER_IDCODE_IS_ILLEGAL(2009,"身份证号不允许包含中文字符, 请确认后再提交"),
    USER_ADD_MUST_ENTERED(2010,"新增正式用户必须录入账号信息"),
    USER_PHONE_IS_ILLEGAL(2011,"手机号格式不规范,请重新输入"),
    USER_PHONE_IS_EXIST(2012,"该手机号已被注册,请重新输入"),
    USER_EMAIL_IS_ILLEGAL(2013,"邮箱格式不规范,请重新输入"),
    USER_EMAIL_IS_EXIST(2014,"该邮箱已被注册,请重新输入"),
    USER_RELATED_IS_EXIST(2015,"该用户信息存在关联数据, 不允许删除"),
    USER_BINDING_IS_EXIST(2016,"该用户已有绑定账号, 绑定失败!"),
    USERNAME_NOT_IS_NULL(2017,"账号名不允许为空"),
    USERNAME_LENGTH_IS_FAIL(2018,"账号名长度不允许小于5位"),
    PASSWORD_NOT_IS_NULL(2019,"密码不允许为空"),
    PASSWORD_LENGTH_IS_FAIL(2020,"密码长度不允许小于6位"),

    /* 租户 2100-2149*/
    TENANT_RELATED_USER_IS_EXIST(2101,"该租户存在已关联的账号信息, 不允许删除"),
    TENANT_SYSTEM_ERROR(2102,"不允许添加系统租户"),
    TENANT_NAME_IS_EXIST(2103,"该租户名称已存在"),
    TENANT_TYPE_IS_NULL(2104,"租户类型不允许为空"),
    TENANT_IS_NULL(2105,"租户不允许为空"),
    TENANT_IS_PENDING_REVIEW(2170, "该租户待审核"),
    TENANT_IS_AUDIT_FAILED(2171, "该租户审核未通过"),
    TENANT_IS_LOCK(2180, "该租户已被冻结"),


    /* 角色 2150-2199*/
    ROLE_IS_NULL(2150,"角色不允许为空"),

    /* 人脸 2200-2299*/
    FACE_ERROR(2200, "调用人脸接口错误"),
    FACE_PATH_NULL(2201, "未查询到匹配的人脸信息"),
    FACE_RELATED_IS_EXIST(2202,"人脸信息已存在关联关系, 请确认后再提交"),
    FACE_RELATED_NOT_USERINFO(2203,"该人脸图片未关联用户信息"),
    FACE_RELATED_NOT_BE_DELETE(2204,"该人脸存在关联数据, 不允许删除"),

    /* 卡号 2300-2399*/
    CARD_FIND_FAIL(2300, "查询卡号错误"),
    CARD_FIND_NULL(2301, "未查询到匹配的卡号信息"),
    CARD_BIND_REPEAT_NULL(2302, "卡号绑定重复或未绑定访客"),
    CARD_BIND_EXIST(2303, "卡号已被绑定"),
    CARD_BIND_FAIL(2304, "卡号绑定失败"),
    CARD_RELATED_IS_EXIST(2305,"卡号信息已存在关联关系, 请确认后再提交"),
    CARD_IS_ILLEGAL(2306,"卡号不允许包含中文字符, 请确认后再提交"),
    CARD_RELATED_USERINFO_NULL(2307,"未查询到卡号关联的用户信息"),
    CARD_IS_EXIST(2308,"卡号已存在, 请勿重复添加"),
    CARD_RELATED_NOT_DELETE(2309,"卡号存在关联业务, 不允许删除"),

    /* 车牌号 2400-2499*/
    CAR_ADD_FAIL(2400, "存储车牌错误"),
    CAR_PARAMETER_IS_NULL(2401, "车牌号参数为空,请输入车牌号"),
    CAR_FIND_FAIL(2402, "查询车牌错误"),
    CAR_FIND_NULL(2403,"未查询到匹配的车牌号信息"),
    RELATED_IS_EXIST(2404,"存在关联业务, 不允许删除"),
    CAR_RELATED_IS_EXIST(2405,"车牌号信息已存在关联关系, 请确认后再提交"),
    CAR_USER_RELATED_NOT_EXIST(2406,"用户-车牌关联信息不存在"),
    CAR_IS_EXIST(2407,"车牌号已存在, 请勿重复添加"),
    CAR_RELATED_NOT_DELETE(2408,"车牌号存在关联业务, 不允许删除"),

    /* 微信 2500-2599 */
    WECHAT_FIND_NULL(2500,"未查询到匹配的微信数据"),
    WECHAT_CODE_NULL(2501,"参数code不允许为空"),
    WECHAT_SYSTEM_CONFIG_NULL(2502,"系统缺少微信app_id和app_secret配置"),
    WECHAT_CALLBACK_NULL(2503,"获取微信响应报文为空"),
    WECHAT_RELATED_NOT_DELETE(2504,"微信存在关联业务, 不允许删除"),
    WECHAT_RELATED_NOT_BIND(2505,"该微信已被绑定, 请勿重复操作"),

    /* 其他异常 2500-2599*/
    USERID_NOT_IS_NULL(2500,"userInfoId参数不允许为空"),
    ISBINDING_NOT_IS_NULL(2501,"isBinding参数不允许为空"),
    MGS_CONFIG_FAIL(2599, "消息服务配置失败"),

    VISITORS_OUTBOUND_NULL(5210, "当前外访申请未找到"),
    VISITORS_OUTBOUND_REVIEW(5211, "当前外访申请暂停审核"),
    VISITORS_OUTBOUND_DEP(5212, "外部预约需要选择外访部门"),
    VISITORS_OUTBOUND_NUMS_EXCEED(5213, "预约人数已满"),
    VISITORS_OUTBOUND_USER_FAIL(5214, "外访人员添加失败"),
    VISITORS_OUTBOUND_CARNO_FAIL(5215, "车牌操作失败"),
    VISITORS_OUTBOUND_FACE_FAIL(5216, "人脸操作失败"),
    VISITORS_OUTBOUND_ENTRANCE_FAIL(5217, "调用设备人脸错误"),
    VISITORS_OUTBOUND_TIME_EXCEED(5218, "预约开始时间与当前时间不得相差7天以上"),
    VISITORS_INVITE_DETAIL_ADD(5230, "外部邀请详情新增失败"),
    VISITORS_INVITE_COUNT(5231, "您已提交过外访申请,请勿重复提交"),
    VISITORS_INVITE_NULL(5232, "未查询到内部邀请信息"),
    VISITORS_INVITE_USER_NULL(5233, "邀请人信息不可用"),
    VISITORS_INVITE_TIME_EXPIRED(5234, "邀请时间已到期,该邀请已失效"),
    VISITORS_INVITE_DETAIL_ZERO(5235, "邀请人员暂时为空"),
    VISITORS_INVITE_STATUS_EXIST(5236, "该邀请已提交"),
    VISITORS_RECORDING_NOT_FOUND(5240, "外访记录不存在"),
    VISITORS_RECORDING_NULL(5241, "外访记录获取为空"),
    VISITORS_RECORDING_DETAIL_ADD(5242, "外访记录详情新增失败"),

    PARKING_AREA_NO_EXIST(5300, "停车场编号已存在,请重新输入"),
    PARKING_REGION_ADD_FAIL(5310, "停车场区域新增失败"),
    PARKING_REGION_UPDATE_FAIL(5311, "停车场区域修改失败"),
    PARKING_REGION_DELETE_FAIL(5312, "停车场区域删除失败"),
    PARKING_REGION_SPACE_EXIST(5313, "该停车场区域下存在停车位,请先删除区域下的停车位"),

    PARKING_SPACE_NO_ALREADY_EXIST(5320, "车位编号已存在,请重新输入"),
    PARKING_SPACE_UPDATE_STATUS_FAIL(5321, "修改车位状态失败"),

    PARKING_CAR_INOUT_ADD_FAIL(5331, "车辆进出新增失败"),
    PARKING_CAR_INOUT_UPDATE_FAIL(5332, "车辆进出修改失败"),
    PARKING_CAR_INOUT_NOT_FOUND(5333, "车辆进出信息未找到"),
    PARKING_CAR_INOUT_ADD_DETAIL(5341, "车辆进出新增详情失败"),
    PARKING_CAR_INOUT_UPDATE_DETAIL(5342, "车辆进出修改详情失败"),
    PARKING_CAR_INOUT_DELETE_DETAIL(5343, "车辆进出删除详情失败"),

    PARKING_ACCOUNT_ADD_FAIL(5350, "停车场关联计费失败"),
    PARKING_ACCOUNT_EMPTY(5351, "计量项为空, 至少选择一项计量项"),
    PARKING_ACCOUNT_FAIL(5352, "获取卡计费套餐失败"),
    PARKING_ACCOUNT_FEIGN_FAIL(5354, "计算价格出错,请重试"),

    PARKING_BILLING_EMPTY(5360, "缴费项为空"),
    PARKING_BILLING_DATE_ILLEGAL(5361, "续费日期不应小于到期时间"),
    PARKING_BILLING_UPDATE_FAIL(5362, "缴费失败"),
    PARKING_BILLING_DETAIL_FAIL(5363, "新增计费详情记录失败"),
    PARKING_BILLING_MONTH_NULL(5364, "缴费月份不能为空"),
    PARKING_BILLING_MONTH_LEAST_MON(5365, "缴费月份至少为1个月"),
    PARKING_BILLING_CAR_REPEAT(5366, "当前车牌已办理过该停车场会员,请重新输入"),
    PARKING_BILLING_EXPIRETIME_BEFORE(5367, "到期时间不能小于开始时间或当前时间"),
    PARKING_BILLING_CARD_NOT_FOUND(5368, "当前停车场不存在该卡,请重新选择"),

    PARKING_PAY_LOG_ADD_FAIL(5370, "支付记录添加失败"),

    PARKING_CARD_EMPTY(5350, "卡为空"),

    PARKING_CARD_PRODUCT_EMPTY(5360, "卡套餐为空"),

    /** Structure资产结构业务枚举 6000-6100 */
    TENANT_ID_NULL(6000,"租户id不能为空"),
    PROVINCE_ID_NULL(6001,"省市区id不能为空"),
    TENANT_TYPE_EXCEPTION(6002,"租户类型应为平台租户,请核实后操作"),
    PARAMETER_TRD_NOT_NULL(6003,"3D模型挂载类型不能为空"),

    STRUCTURE_EXIST(6010,"该资产结构已存在,请核实后操作"),
    STRUCTURE_NO_EXIST(6011,"资产结构节点不存在,请核实后操作"),
    STRUCTURE_NAME_EXIST(6012,"该名称已存在,请核实后操作"),
    STRUCTURE_NAME_NO_EXIST(6013,"该名称不存在,请核实后操作"),
    STRUCTURE_ANCHORS_INFO_EXIST(6014,"当前资产结构节点存在锚点信息,请核实后操作"),
    STRUCTURE_LIST_EXCEPTION(6015,"资产结构List列表数据异常:当前无数据"),
    STRUCTURE_PATH_EXCEPTION(6016,"该资产结构路劲异常,请核实后操作"),
    STRUCTURE_NODE_BE_OCCUPIED(6017,"该资产结构节点已被占用,请核实后操作"),

    PARENT_NODE_EXCEPTION(6030,"父级节点数据异常"),
    CHILDREN_NODE_EXCEPTION(6031,"子级节点数据异常"),
    CHILDREN_NODE_EXIST(6032,"当前节点存在子节点,请核实后操作"),

    ANCHORS_EXIST(6040,"存在锚点信息,请核实后操作"),
    ANCHORS_NO_EXIST(6041,"存在锚点信息,请核实后操作"),

    ANCHORS_TYPE_LIMIT(6042,"锚点Type参数为0或1,请核实后操作"),
    ANCHORS_TYPE_OR_MACHINE_NULL(6043,"锚点Type或machineId为空,请核实后操作"),


    /** Meeting智慧会议业务枚举 6100-6200 */
    MEETING_ACTIVITY_NULL(6120,"会议室审批资源不存在,请核实后操作"),
    MEETING_ACTIVITY_REVIEW(6121,"会议室资源未审核,请核实后操作"),

    /** 7000-7099 支付业务枚举*/
    PAY_FAIL(7000, "支付失败"),

    /** 7100 - 7199 消息枚举 */
    WEBPUSH_PRODUCT_LIST_NULL(7100,"产品套餐为空"),
    WEBPUSH_ORDER_NULL(7101,"订单为空"),
    WEBPUSH_ORDER_ADD_FAIL(7102,"订单创建失败"),
    WEBPUSH_ORDER_DETAIL_NULL(7110,"订单详情为空"),
    WEBPUSH_ORDER_DETAIL_ADD_FAIL(7111,"订单详情创建失败"),
    WEBPUSH_RECHARGE_TOP_FAIL(7120,"充值失败"),


    /**JSON合并 9999**/
    JSON_Empty(9900,"json数据为空"),
    JSON_WRONG_FORMAT(9901,"json格式有误"),
    JSON_MERGE(9902,"(TF文件)JSON数据合并失败"),
    JSON_CONVERT_FAIL(9903,"JSON转换失败"),

    /* BIM */
    BIM_SERVER_ERROR(11180, "BimServer服务器未知错误"),
    BIM_IO_FAIL(11181, "BIM IO流错误"),
    BIM_CHECK_FAIL(11182, "ifc 上传文件失败"),
    BIM_DESERIALIZER_FAIL(11183, "反序列化器失败"),


    ACTIVITI_MODEL_NULL(13100, "模型图未找到,请添加并保存模型图"),
    ACTIVITI_MODEL_NAME_EXIST(13101, "模型名称已存在、请重新输入"),
    ACTIVITI_MODEL_KEY_EXIST(13102, "模型KEY已存在、请重新输入"),
    ACTIVITI_MODEL_MGS_ADD_FAIL(13103, "消息服务关联模型失败"),
    ACTIVITI_MODEL_MGS_DELETE_FAIL(13103, "删除消息服务关联模型失败"),
    ACTIVITI_PROCESS_START(13200, "流程实例挂起失败"),
    ACTIVITI_PROCESS_TASK_ALERADY(13201, "该流程实例下存在待办任务"),

    /* 应用设置 15000-15200 */
    APP_CLASSIFY_NAME_REPEAT(15000,"应用分类名称已存在"),
    APP_CLASSIFY_BINDING_ERROR(15001,"该分类已关联应用,请先解除应用关联"),
    APP_ACTIVERULE_REPEAT(15002,"应用路由已存在"),
    pass_platform_REPEAT(15003,"已配置用户信息,不可重复提交"),
    APP_NAME_FALE(15004,"应用名称已存在"),
    APP_NOT_FOUND(15005,"应用不存在");


    /**
     * 错误编码
     */
    private int code;
    /**
     * 描述
     */
    private String description;

}


2. StructureEnumConstants.java

package com.linksame.iot.asset.structure.cache;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * @Author: menghuan
 * @Date: 2021/12/7 10:39
 */
@Getter
@AllArgsConstructor
public enum StructureEnumConstants {

    STRUCTURE_MACHINE_STRUCTURE(10001,"structure_machine_structure","空间结构:设备与空间结构关系"),
    STRUCTURE_MACHINE_TENANT(10002,"structure_machine_tenant","空间结构:设备与租户关系"),
    MACHINE_ID(10003,"machine_id","设备ID:"),
    PARAM_ID(10004,"param_id","参数ID:"),
    STRUCTURE_ID(10005,"structureId","空间结构ID"),
    TENANT_ID(10006,"tenantId","租户ID"),
    NAME(10007,"name","名称"),
    STATUS(10008,"status","状态"),
    PRO_TYPE(10009,"proType","产品类型"),
    PRO_ID(10010,"proId","产品ID"),

    STATUS_ZERO(20000,"0","零"),
    STATUS_ONE(20001,"1","一"),
    STATUS_TWO(20002,"2","二"),
    STATUS_THREE(20003,"3","三"),
    STATUS_FOUR(20004,"4","四"),
    STATUS_FIVE(20005,"5","五"),

    TRD_PARAMETER_NOT_NULL(30001, "3D","3D模型挂载类型不能为空"),

    END_LABEL(9000,"end_label","结束标签");

    /** 错误编码 */
    private int code;

    /** KEY */
    private String key;

    /** 描述 */
    private String description;


}


3. Class 定义常量

采用 “类.常量名" 方法进行调用。

需要私有化构造方法,避免创建该类的实例。同时不需让其他类继承该类。

如果多处需要访问工具类中定义的常量,可以通过静态导入(static import)机制,避免用类名来修饰常量名。

普通类中可以通过提供 get() 的方法来提供调用。

public final class ClazConstants {
    //私有构造方法
    private ClazConstants(){}

    public static final int ConstantA = 100;
    public static final int ConstantB = 200;
}

interface 中定义常量方法生成的 class 文件比第一种方法的 class 文件更小,且代码更简洁,效率更高。


4. interface 里定义 interface ( 为了减少接口的定义 , 同时将常量分类 )

示例:

public interface ConstantUtil {

    interface Status {
        int STATE_DISPLAY = 1;
        int STATE_HIDDEN = 2;
        int STATE_DELETED = 3;
    }

    interface SequenceName {
        String MOUDLE_SEQUENCE = "intpub_moudle";
        String MENU_SEQUENCE = "intpub_menu";
        String INFO_SEQUENCE = "intpub_info";
        String MOUDLE_PART_SEQUENCE = "intpub_moudle_part";
        String PART_SEQUENCE = "intpub_part";
        String ROLE_SEQUENCE = "intpub_role";
        String USER_SEQUENCE = "intpub_user";
        String MENU_ROLE_SEQUENCE = "intpub_menu_role";
    }

    interface HtmlUrl{
        String HTML_URL="E:/onlineExam/project/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/IntpubWeb";
    }
}

interface 里定义 interface 的意义:

1、为了减少接口的定义,同时将常量分类 ( 分组 )


5. 常量和枚举的区别

常量中存在的缺点 :

①常量作为参数时,是String,int 等弱类型,开发员传入没有在常量接口里定义的值,这个问题无法通过编译器发现 ;

②由于开发员可以直接写常量值,所以不能用对比,只能用 equals() 对比,不能优化性能;

③编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译所有引用常量的类因为里面存的是旧值。

枚举的优点 :

①私有构造函数,避免被继承和扩展;

②定义方法的参数时,必须用枚举常量类类型;

③常量值地址唯一,可以用直接对比,性能会有提高;

④编译时,没有把常量值编译到代码里,即使常量的值发生变化也不会影响引用常量的类;

根据以上的优缺对比,显然得知枚举的方式更适合项目中使用。

但是就以通常的写法来看,枚举的方式是最繁琐的,编程上不够简便。

所以综上所述,如果就便捷而言推荐使用 Class 的方式定义常量,若就性能和安全性来说推荐使用枚举的方式定义常量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值