【小家java】java中维护常量使用常量类?接口?还是枚举呢?

简介: 【小家java】java中维护常量使用常量类?接口?还是枚举呢?

相关阅读


【小家java】java5新特性(简述十大新特性) 重要一跃

【小家java】java6新特性(简述十大新特性) 鸡肋升级

【小家java】java7新特性(简述八大新特性) 不温不火

【小家java】java8新特性(简述十大新特性) 饱受赞誉

【小家java】java9新特性(简述十大新特性) 褒贬不一

【小家java】java10新特性(简述十大新特性) 小步迭代

【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本

每篇一句


只要学不死,就往死里学。我们离过劳死都还远着呢


1、概述


在编码过程中,避免不了维护一些常量。而通过这么多的项目中发现,使用方式都不尽相同。有用常量类的、有用接口的、有用枚举的,因此本文针对于常量的管理做一些讨论

2、栗子


第一种使用接口:


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


第二种使用常量类:


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


第三种使用枚举:


@Getter
@AllArgsConstructor
public enum ChildType {
    NORMAL_PARENT(0, "正规课"),
    TRIAL_PARENT(1, "体验课");
    private int id;
    private String name;
}


相比较第一种和第二种其实差不多,但第一种显然更简洁,因为不用写public static final了嘛,更方便了。但是,但是,但是不建议在接口中定义常量。因为我在阅读《Effective Java》这本书中提到过:


如果某个实现了常量接口的类被修改不再需要常量了,也会因为序列化兼容原因不得不保持该实现,而且非final类实现常量接口会导致所有子类被污染


所以我个人推荐:接口中的常量, 不应该用于全局. 而应当用在与之相关的类中。这样能保持很好的层级关系和隔离性,方便分包和扩展,具体请参考spring中对常量维护的原则。


当然,刚才说了不建议把一般的常量放在接口里,所以我们可以放在常量类了,但建议常量类是final的。


什么时候使用枚举呢?其实建议使用枚举。《Effective Java》中也是推荐使用枚举代替int常量的。枚举当然是首选,另如果不用枚举,在《Effective Java》一书中,作者建议使用一般类加私有构造方法的方式,至于为什么不用接口,那就要上升到语言哲学问题了(可参考上面通俗易懂的话)。


此处个人不建议什么都使用枚举来代替常量类。比如毫无规则归类可言的一些常量:如SUCCUSS字符串、密钥串、路径等等这些,可以放在一个常量类里面糅在一起。而对于数据库中对应type、status类型字段并且是可以枚举出来的,强烈建议使用enum类型,在平时获取、使用、校验起来常量无法比拟的,而且可以很少犯错,非常大程度上增加代码的可读性,这也是为什么JDK5要推荐使用枚举类的原因吧。


最后,本人建议大家可以在设计代码的时候,多用接口规范代码,哪怕只是一个标记接口,也尽量为了长远考虑而设计出来。通过读spring、mybatis源码会发现里面不乏一些标记接口,在向上抽象归类判断的时候,非常有用。


3、使用场景


大力推荐枚举类型的使用,让他无处不在的去管理你的代码,可以让代码结构更加清晰易懂可扩展。而常量类可以收集管理一些比较杂的一些常量。而接口的中的常量,在遵循开闭原则的基础上,向上抽象管理自己的内聚的常量


4、最后


写代码也是一种艺术,结构层次好的代码可以少出bug,提高效率。用一句话总结就是:设计良好的代码结构,尽量面向元数据编程。



相关文章
|
1天前
|
存储 安全 算法
Java基础19-一文搞懂Java集合类框架,以及常见面试题(二)
Java基础19-一文搞懂Java集合类框架,以及常见面试题(二)
25 8
|
1天前
|
安全 Java 开发工具
Java基础19-一文搞懂Java集合类框架,以及常见面试题(一)
Java基础19-一文搞懂Java集合类框架,以及常见面试题(一)
19 6
|
1天前
|
JSON Java 数据格式
java读取接口返回的json数据 (二)
java读取接口返回的json数据 (二)
13 5
|
1天前
|
JSON Java 数据格式
java读取接口返回的json数据
java读取接口返回的json数据
15 5
|
1天前
|
安全 Java 编译器
Java基础14-深入理解Java枚举类(二)
Java基础14-深入理解Java枚举类(二)
9 4
|
1天前
|
Java 编译器
Java基础14-深入理解Java枚举类(一)
Java基础14-深入理解Java枚举类(一)
12 0
|
1天前
|
前端开发 JavaScript Java
Java基础10-深入理解Class类和Object类(二)
Java基础10-深入理解Class类和Object类(二)
13 5
|
1天前
|
Java C++
Java基础10-深入理解Class类和Object类(一)
Java基础10-深入理解Class类和Object类(一)
12 4
|
1天前
|
Java
Java基础7-一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别(二)
Java基础7-一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别(二)
7 0
|
设计模式 存储 Java
建议速读 | Java 常量定义的正确姿势!
在 Java 中,关于常量的话题似乎有很多困惑。有些人使用整数或字符串来定义常量,而另一些人则使用枚举。我还遇到了在其自己的接口中定义的常量,使用该常量的类必须实现该接口。这种策略通常称为接口常量设计模式。
372 0