常量应该封装到常量类,常量接口,还是枚举类中?

常量应该封装到常量类,常量接口,还是枚举类中?

前言


之前项目中响应前台的接口中会用到一些公共常量。这个时候就比较纠结,常量到底是封装到哪里比较好呢,因为以前写的很多代码不怎么规范,而且有时候常量用到的不算太多太集中,所以就哪里用到哪个类上去声明一个出来,这样虽然很方便,但是统一维护起来,项目做大了,有些时候你要引用一个你记得你明明声明过的常量,却找半天都找不到,而且后期需要对常量中的内容进行一些修改的时候,维护起来也十分不方便,代码整体结构也不优雅。所以自己决定研究一下到底常量应该封装到哪里比较好呢。因为题目所说的三种自己也都见过,但是具体的区别以及优劣却没有细细钻研。今天这里简单的记录整理一下,以防自己以后忘记。

示例代码


第一种使用接口:

public interface Constants{
  
    int AUDIT_STATUS_PASS = 1;
    int AUDIT_STATUS_NOT_PASS = 2;
}

第二种使用类:

public final class Constans{
  
    private Constans() {
    }
  
    public static final int AUDIT_STATUS_PASS = 1;
    public static final int AUDIT_STATUS_NOT_PASS = 2;
}

第三种使用枚举:

public enum Constants {

    AUDIT_STATUS_PASS(1),
    AUDIT_STATUS_NOT_PASS(2);
    
    private int status;
    
    private Constants(int status){
        this.setStatus(status);
    }

    public int getStatus() {
        return status;
    }
}

首先,前两种可以看成是一样的。第一种写起来更方便一些吧,省去了public static final字段。但是如果从细想,接口可以被继承,可以将内容深入到其实现类代码中。这样对于一个常量类接口来说显然是不合理,但是你确实无法规避这个问题。唯一可以解决的办法就是弃用常量接口,选用常量类的方式。以final字段修饰,防止其被继承。并将其构造函数private化,防止被实例化。这显然在硬性上可以很好地解决这个问题。

但即便如此枚举任然是首选,但是如果不使用枚举的话,在《Effective Java》一书中,作者建议使用一般类加私有构造函数的方式。但是参考了 StackOverFlow 上大牛的讲解,我认为一般类上也应该再加上final字段。这样可以更好的避免一些不必要的麻烦。

参考:Interfaces with static fields in java for sharing 'constants'

常量接口


你可能会问常量接口就真的一无是处吗?

也不是,但是和是也差不多。但是我还是会用,贴一段自己的代码

public final class Const {

    private Const() {
    }

    public static final String CURRENT_USER = "currentUser";

    // 这里没有使用interface进行分组是因为 这两个对象不好分组。
    public static final String EMAIL = "email";
    public static final String USERNAME = "username";

    // 普通用户和管理员是一个组,枚举过于繁重
    // 内部接口类 把常量进行分组。没有枚举重,但还可以分组,而且里面还是常量
    public interface Role {
        int ROLE_CUSTOMER = 0; // 普通用户
        int ROLE_ADMIN = 1; // 管理员
    }
}

具体常量接口的作用注释中已经写得很清楚了。总结下来就是前提你是内部接口,那么你可以直观分组,还简洁。

总结


综上:优先枚举,常量类,接口(不建议)。

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值