JAVA中常量使用常量类或者常量接口还是使用枚举,错误代码和中文可变信息的枚举实现

文章目录

关于“JAVA中常量使用常量类或者常量接口还是使用枚举”,已有定论-使用枚举,原因就不再展开了。

借助java枚举,可以在定义错误名称和代码的同时,定义中文描述信息,但是实际应用中,往往需要在标准错误信息中增加一些可变信息。代码实现如下。
调用实例

  @Test
    void contextLoads() {
        String desc = MsgErr.DB_WRITE.getDesc("是否不唯一?");
        System.out.println("desc = " + desc);
        desc=MsgErr.INPUT_INVALID.getDesc();
        System.out.println("desc = " + desc);
        desc=MsgErr.INPUT_INVALID.getDesc("字典类型");
        System.out.println("desc = " + desc);

    }
desc = 保存数据失败!(注:是否不唯一?)
desc = 输入参数无效,无法处理!
desc = 输入参数[字典类型]无效,无法处理!

代码

package com.muyi.common.enums;

import io.swagger.annotations.ApiModel;

/**
 * 枚举:错误信息
 * <pre>
 *     中文信息中可定义字符串格式化转换符,获取中文信息时可以添加自定义信息
 * </pre>
 * @author MuYi
 * @version 1.0
 * @date 2022/4/7 17:33
 **/
@ApiModel(value = "接口MsgErr", description = "枚举:错误信息")
public enum MsgErr {
    /**
     * 输入参数[%s]为空,无法处理!
     */
    INPUT_NULL(0, "输入参数[%s]为空,无法处理!"),
    /**
     * 输入参数[%s]无效,无法处理!
     */
    INPUT_INVALID(1, "输入参数[%s]无效,无法处理!"),
    /**
     * 读取数据时发生错误
     */
    DB_READ(2, "读取数据时发生错误!"),
    /**
     * 保存数据失败(数据是否不唯一?、校验是否有误?)
     */
    DB_WRITE(3, "保存数据失败!");
    private final String  desc;
    private final Integer value;

    /**
     * 获得中文信息。如果包含字符串格式化转换法,自动移除
     *
     * @return 中文信息
     */
    public String getDesc() {
        return desc.contains("[%s]") ?
                desc.replace("[%s]", "") : desc;
    }

    /**
     * 获得中文信息。
     * <pre>
     *     如果包含字符串格式化转换法,自动替换为输入参数
     *     不含字符串格式化转换法,在中文信息尾部添加输入参数
     * </pre>
     *
     * @param params 中文信息附加信息
     * @return 中文信息
     */
    public String getDesc(Object params) {
        return desc.contains("[%s]") ?
                String.format(desc, params) :
                String.format("%s(注:%s)", desc, params);
    }

    public Integer getValue() {
        return value;
    }

    private MsgErr(Integer value, String desc) {
        this.desc = desc;
        this.value = value;
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 常量接口是指一个接口只包含常量的定义,不包含方法的定义。实现常量接口则是指在类实现接口,从而可以直接使用接口定义的常量。 利: 1. 提高代码的可读性和可维护性:将常量到一个接口,方便查找和修改。 2. 方便使用:通过实现常量接口,在代码可以直接使用接口定义的常量,而不需要在代码多次定义。 3. 避免命名空间污染:通过实现常量接口,可以避免定义重复的常量名称,从而避免命名空间污染。 弊: 1. 接口常量不允许修改,容易导致代码的不灵活性。 2. 常量接口可能会被滥用,将不应该作为常量的变量也定义为常量。 3. 常量接口的改动可能会引起实现接口的类的改动,从而增加了代码的维护难度。 因此,在使用常量接口时,需要权衡其利弊,避免滥用。如果需要定义常量,建议将其定义在类,而不是定义在接口。 ### 回答2: 常量接口是指只包含常量声明的接口,而没有其他方法或属性的接口。在Java常量一般使用static final关键字进行定义,但是将常量在一个接口定义可以提供更好的可维护性和可扩展性。 利: 1. 代码的可读性和可维护性:通过将常量在一个接口声明,可以提高代码的可读性和可维护性。其他类只需通过接口名访问常量,无需关心具体实现。 2. 代码的重用性:常量接口可以在多个类直接使用,避免了重复定义常量,减少了代码冗余。 3. 枚的替代方案:常量接口可以用来替代枚类型,特别适用于一组相关的常量集。 弊: 1. 接口污染:常量接口会将常量暴露给所有实现接口的类,可能导致接口的职责变得复杂,违背了接口的设计初衷。 2. 兼容性问题:如果常量接口常量被修改或删除,所有依赖该接口的类都需要进行相应的修改。这给代码维护带来一定的困扰。 3. 命名空间问题:常量接口常量是隐式public static final的,所以一旦一个类实现常量接口,该类的所有成员变量和方法都无法再使用接口同名的标识符。 4. 缺乏类型安全性:常量接口常量是静态绑定的,无法被子类重写,这可能导致子类覆盖了父类的常量,引起潜在的错误。 综上所述,常量接口在一些特定场景下可以带来方便和灵活性,但需要注意管理和维护的问题,以及与接口设计的兼容性和命名空间冲突问题。在实际开发,需要根据具体情况进行选择和使用。 ### 回答3: 常量接口是指将类常量抽取出来,定义在一个接口,然后在其他类通过实现接口使用这些常量实现常量接口的方式有其利与弊。 利: 1. 代码重用:常量接口可以在多个类重复使用,避免了重复定义常量的问题,提高了代码的复用性。 2. 统一管理:常量接口可以将所有的常量管理,减少了代码的魔法数字,使得代码更加清晰易读。 3. 方便修改:如果需要修改常量的值,只需要修改接口常量值,就可以在所有使用常量的地方生效,提高了维护的便捷性。 弊: 1. 接口污染:常量接口除了常量外,还可以定义方法,如果其他类实现常量接口后,必须实现接口的所有方法,而这些方法有可能对实现类来说并没有意义,这就造成了接口污染。 2. 类耦合:常量接口会导致实现类与常量接口产生耦合,一旦常量接口常量发生变化,就需要修改所有实现类,影响了代码的灵活性。 3. 命名冲突:如果同一个类实现了多个含有相同常量接口,且这些常量具有相同的名称,可能会导致命名冲突,需要通过全限定名来区分。 综上所述,常量接口在一定情况下可以提高代码的可读性和可维护性,但过度使用常量接口可能会导致接口污染、类耦合和命名冲突等问题。因此,在使用常量接口时需要权衡利弊,选择合适的使用方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

muyi517

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值