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类型

相关文章
|
3月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
143 4
|
3月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
225 5
|
3月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
219 1
|
3月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
242 0
|
3月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
271 1
|
3月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
218 1
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
195 7
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
643 58
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
272 3
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
227 2