【实际开发12】- Utils / tools

news2025/1/10 16:29:18

目录

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 的方式定义常量,若就性能和安全性来说推荐使用枚举的方式定义常量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面经八,笔试加面试

Java 开发面试题&#xff0c;尧壁信科有限公司 笔试&#xff1a; 1、Java 中有几种类型的流&#xff1f; 字节流字符流&#xff0c;输入流输出流 2、什么是 java反射? 在程序的运行状态中&#xff0c;对于任意一个类&#xff0c;都可以知道整这个类的所有属性和方法&#xf…

如何锁定Excel表格的公式不被修改

很多小伙伴在制作Excel表格的时候&#xff0c;往往还会设置很多公式&#xff0c;但如果不小心或被他人随意修改了公式&#xff0c;就会造成数据错误&#xff0c;为了避免这种情况&#xff0c;其实我们可以设置保护&#xff0c;让公式锁定无法被修改。 下面举一个例子来看看如何…

【C语言 数据结构】串

文章目录串类型的定义串的表示和实现定长顺序存储堆分配存储表示串的块链存储表示串的模式匹配算法字串的定位函数匹配模式的改进算法串类型的定义 对于由多个字符&#xff08;≥ 0&#xff09;组成的字符串&#xff08;例如 http://data.biancheng.net&#xff09;&#xff0…

Git版本如何使用命令进行升级(win10)

1、桌面鼠标右键&#xff0c;点击Git Bash Here,输入git --version 查看目前Git版本。 2、输入git update-git-for-windows 升级版本&#xff0c;再输入y同意升级并覆盖之前的版本。 我在版本升级的过程中遇到了error: RPC failed&#xff1b; curl 92 HTTP/2 stream 0 was not…

SaaS-API越权漏洞检测系统

概述通过替换认证信息后重放请求&#xff0c;并对比数据包结果&#xff0c;判断接口是否存在越权漏洞特点支持HTTPS自动过滤图片/js/css/html页面等静态内容多线程检测&#xff0c;避免阻塞支持输出报表与完整的URL、请求、响应安装和使用安装依赖git clone https://github.co…

Eyeshot 2023 测试版,离发行版不远了

Eyeshot 2023 测试版 这个 Beta 版本来得太晚了&#xff0c;因为我们决定放弃许多客户不喜欢的 v2022 GEntities。该产品已根据以下架构进行了完全重构。例如&#xff0c;使用 Eyeshot 2023 可以非常轻松地在 Web 项目中使用没有 UI 的产品。这也简化了从 Eyeshot 2021 版的项…

【软件测试】6年资深测试总结的,测试人常常犯的9大误区,背锅不存在的......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 1、把原型设计、UI效…

Chapter3:机器人系统设计

ROS1{\rm ROS1}ROS1的基础及应用&#xff0c;基于古月的课&#xff0c;各位可以去看&#xff0c;基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本&#xff1a;ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic&#xff1b;实际机器人&#xff1a;Ha…

无忧·企业文档自助配置完成单点登录配置,对接企业原有组织架构

我作为企业文档的产品负责人&#xff0c;常常被问及企业文档和其他在线文档有啥差不一样的地方&#xff1f;我大致总结了下&#xff0c;有几个方面&#xff1a;1、企业文档定位于企业内部的内容管理工具&#xff0c;侧重于私有化部署。核心的是数据的控制权在企业自己手中&…

类和对象-对象特性

前言&#xff1a;主要讲述对象的初始化与清理&#xff0c;构造函数与析构函数&#xff0c;其分类和调用&#xff0c;以及调用时机等相关内容对象的初始化与清理&#xff1a;1.生活中我们买的电子产品都基本会有出厂设置&#xff0c;在某一天我们不用的时候也会删除一些自己的信…

Java基础多线程下篇

本篇本文目录:一.线程死锁1.重入锁2.释放锁3.死锁4.wait和notify二.锁1.ReentrantLock2.Condition3.ReadWriteLock4.StampedLock5.Semaphore6.线程并发安全(1) concurrent(2) atomic三.线程池1.通过线程池分配线程2.FixedThreadPool3.CachedThreadPool4.ScheduledThreadPool四.…

粒子输运的蒙特卡罗方法介绍

蒙特卡罗大部分改概念和方法不依赖空间的维度&#xff0c;可以先讨论一维情况下粒子的蒙特卡罗输运。单能粒子输运的玻尔兹曼方程可以写为&#xff1a;仅考虑散射和吸收EtEsEa吸收意味着粒子生命周期的终结。图2.1示例&#xff1a;通过蒙特卡罗方法确定目标几何体内外的中子分布…

宕机了,Redis 如何避免数据丢失?

前言 如果有人问你&#xff1a;"你会把 Redis 用在什么业务场景下&#xff1f;" 我想你大概率会说&#xff1a;"我会把它当作缓存使用&#xff0c;因为它把后端数据库中的数据存储在内存中&#xff0c;然后直接从内存中读取数据&#xff0c;响应速度会非常快。…

机器学习实战(第二版)读书笔记(5)——Embedding

一、使用范围(作者经验)&#xff1a; 类别 < 10 通常采用独热编码方式。类别 > 50( 通常这种情况需要使用哈希桶)&#xff0c;通常最好使用嵌入。10 - 50 可以尝试两种方式&#xff0c;选择最优。 目的&#xff1a;同义词具有非常接近的嵌入&#xff08;将嵌入向量当作嵌…

股票接口自动下单怎么处理?

股票接口自动下单怎么处理的&#xff1f;经过小编的小编的了解&#xff0c;股票交易接口是由很多资源和开发源码的设计来构建的&#xff0c;有的专业开发团队将这些开发研究和完善&#xff0c;但是&#xff0c;这些股票接口不一定就是由其自身提供的&#xff0c;可以是投资者个…

C语言基础(一)—— C语言概述(领域、编译过程、IDE)

1. 什么是C语言语言是人和人交流&#xff0c;C语言就是人和计算机交流的一种语言2. 为什么要学习C语言2.1 C语言特点优点&#xff1a;代码量小执行速度快功能强大编程自由缺点&#xff1a;写代码实现周期长可移植性较差过于自由&#xff0c;经验不足易出错对平台库依赖较多2.2 …

Hystrix执行时内部原理

Hystrix最基本的支持高可用的技术资源隔离和限流。创建command,执行这个command,配置这个command对应的group和线程池。这里分析一下开始执行这个command,调用了这个command的execute()方法之后,Hystrix底层的执行流程和步骤以及原理是什么。整个8大步骤的流程图: 步骤一:…

Hive(6):数据定义语言(DDL)案例

1 原生数据类型案例 文件archer.txt中记录了相关信息&#xff0c;内容如下所示&#xff0c;其中字段之间分隔符为制表符\t,要求在Hive中建表映射成功该文件。 1 后羿 5986 1784 396 336 remotely archer 2 马可波罗 5584 200 362 344 remotely archer 3 鲁班七号 5989 1756 4…

JVM笔记(5)—— 运行时数据区—— 方法区

上一篇&#xff1a;JVM笔记&#xff08;4&#xff09;—— 运行时数据区——堆空间 一、栈、堆、方法区的交互关系 进程运行过程中&#xff0c;在方法中创建对象时通过方法区中的类型信息在堆中创建对应的对象&#xff0c;对象中又存有指向方法区中对应类型信息的指针&#xf…

Python采集热搜评论数据,制作词云分析,又是吃瓜的一天

前言 最近微博上的爆的热搜是不少啊&#xff0c;咳咳&#xff0c;23年1月31号记汪峰旷工一次 之前有营销号预言23年的娃瓜 已经爆出来一个了 好像是说还有两个来着 也不知道是谁的娃~ 现在已经没有什么可以震惊到我的了 胡歌都有娃了 彭于晏抓紧吧 有点点的无聊 就来用Pytho…