Java维护常量方式的比较——接口、常量类与枚举

简介: Java维护常量方式的比较——接口、常量类与枚举一、示例​ 1.让类实现定义了常量的接口

Java维护常量方式的比较——接口、常量类与枚举

一、示例

1.让类实现定义了常量的接口

public interface Constants{
   int SUCCESS = 1;
   int ERROR = 2;
}

2.定义常量类

public class Constants{
    public static final int SUCCESS = 1;
    public static final int ERROR = 2;
}

3.定义枚举

@Getter
@AllArgsConstructor
public enum ResultEnum {
    SUCCESS(1),
    ERROR(2);
    private value;
}

二、比较

1.在接口中定义常量是不被建议的


如果某个实现了接口的类被修改了,不再需要使用这些常量了,他依然必须实现这个接口,以确保二进制兼容性:可以理解为如果非final 类实现了常量接口,它的所有子类的命名空间也会被接口中的常量所污染;比如A.class接口中定义了一个常量constantA(接口中变量必须定义成static final),B.class实现了A.class并使用了常量constantA,C.class继承了B.class也使用了constantA;现在B不需要再使用constantA,但是也必须实现这个接口,因为B的子类使用了constantA常量。


2.枚举和常量不是一个维度的东西,枚举是对象,常量是字段


常量能做的,枚举都能做,枚举能做的常量不一定能做


每个枚举都是通过 Class 在内部实现的,且所有的枚举值都是 public static final 的


而常量类中通常也使用 public static final 修饰常量


3.入参约束:对于常量很难约束调用者按你的意图传参,但枚举不仅可以约束入参,还能很好的提示调用者


4.switch语句支持枚举型,当switch使用int、String类型时,由于值的不稳定性往往会有越界的现象,对于这个的处理往往只能通过if条件筛选以及default模块来处理。而使用枚举型后,在编译期间限定类型,不允许发生越界的情况


1)常量类


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

由于开发人员可以直接写常量,所以不能用==对比,只能用equals对比,不能优化性能

equals是比较两个对象的内容是否相等,== 比较的是两个对象的地址是否相同


而处于不同地址的两个对象是可以相同的,所以对于常量来说,用户传入的参数是自己写的(新创建的)常量,与常量类中定义的常量显然是不同的对象,所以要比较的是内容是否相同而非地址


而对于枚举,参数接收的是枚举中定义的静态对象(即传入的就是事先存在的、枚举中的对象),即常量值地址唯一(因为其构造函数是私有的,无法通过外部构造出对象),所以只要比较地址即可


开发人员没有参考资料时,不可能知道某个int类型的参数到底应该赋什么内容

编译时,是直接把常量的值编译到类的二进制代码里,所以当常量的值进行更改之后是需要重新编译已更改原本的旧值的

2)枚举


构造方法默认的修饰符是private,故常量值地址唯一,可以用==直接对比,性能会有提高

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

三、使用场景

无规则归类的一些常量:如SUCCESS字符串、密钥串、路径等等可以放在一个常量类里面


而对于数据库中对应type、status类型字段并且是可以枚举出来的,此外比如错误码等强烈建议使用enum类型

相关文章
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
160 57
|
11天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
14天前
|
数据采集 JSON Java
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
19天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
46 6
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
55 24
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
65 8
|
2月前
|
Java API
Java中内置的函数式接口
Java中内置的函数式接口
27 2
|
2月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
125 1
|
设计模式 存储 Java
建议速读 | Java 常量定义的正确姿势!
在 Java 中,关于常量的话题似乎有很多困惑。有些人使用整数或字符串来定义常量,而另一些人则使用枚举。我还遇到了在其自己的接口中定义的常量,使用该常量的类必须实现该接口。这种策略通常称为接口常量设计模式。
626 0
|
存储 缓存 网络协议
阿里Java编程规约【二】常量定义
1. 【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。 反例:
491 0