首页 > 其他分享 >常量定义在接口还是类中?

常量定义在接口还是类中?

时间:2023-08-17 15:11:50浏览次数:23  
标签:常量 int 接口 final 枚举 public 类中

1. 前言

最近看项目的时候发现,这个项目把常量定义在接口当中,感觉到很神奇,随之我就想到了一个问题,竟然常量可以定义到接口里,也可以定义到类和枚举中,哪到底哪个更合适一点,于是我上网查了一些资料。得出一下结论

2. 解析

public interface Constants{
   int USER_EROOR = 1;
   int USER_EROOR_PASS = 2;
}
public class Constants{
   public static final int USER_EROOR = 1;
   public static final int USER_EROOR_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源码会发现里面不乏一些标记接口,在向上抽象归类判断的时候,非常有用。

标签:常量,int,接口,final,枚举,public,类中
From: https://www.cnblogs.com/lymf/p/17637606.html

相关文章

  • 记一次奇葩接口
    1.回传接口要求第一次遇到这么奇葩的API接口回传要求:HTTPStatus为500、1000、或者超时、响应慢都要重试前10分钟每30s重试一次。后续每5分钟重试一次。如果12小时还未成功直接丢弃数据你说数据重要嘛,你后面又不要了,说不重要嘛12h的重试。。。所以避免折腾,所有丢弃的数据还......
  • Feign接口返回值加多层泛型,但没有反序列化彻底
    1、问题描述接口返回值加多层泛型,但没有反序列化彻底2、问题原因jackson-databindjar包版本的问题我们之前用的是2.11.2,这个版本有bug,版本变成2.11.3就好了......
  • 关于API数据接口获取商品的数据的说明
    获取商品数据已经成为许多应用程序的重要组成部分。为了实现这一目标,许多公司和技术开发者使用API数据接口来获取相关数据。本文将详细介绍如何使用API数据接口获取商品数据,并使用Python作为编程语言示例来展示相关代码。API数据接口是一种通信协议,它允许不同的应用程序或服务之间......
  • 接口返回图片使用什么类型_JavaWeb
    publicResponseEntity<byte[]>icon(){//第三方接口返回的图片验证码ResponseEntity<byte[]>response=restTemplate.getForEntity(url,byte[].class);……//由后端转发此请求,是因为此处需要做一些特殊处理......
  • applicationrunner用法 是一个方便的接口,可以用于在应用程序启动后执行一些逻辑,比如数
    applicationrunner用法原文链接:https://wenku.csdn.net/answer/d8f7f4398bc786e79ed79f09b540878fApplicationRunner是SpringBoot中的一个用于运行应用程序的类。它可以帮助你快速启动和运行你的应用程序,而不需要写很多代码。你可以通过实现ApplicationRunner接口并重写run方法......
  • Shiro配置类中的各个配置项浅谈
    背景:上文中在落地实践时,对Shiro进行了相关的配置,并未对其含义作用进行详细学习,本章将进一步详解其作用含义。Shiro配置类中的各个配置项的作用: @BeanpublicSecurityManagersecurityManager(){DefaultWebSecurityManagersecurityManager=newDefaultWebSecurityM......
  • 通过微软Azure调用GPT的接口API-兼容平替OpenAI官方的注意事项
    众所周知,我们是访问不通OpenAI官方服务的,但是我们可以自己通过代理或者使用第三方代理访问接口现在新出台的规定禁止使用境外的AI大模型接口对境内客户使用,所以我们需要使用国内的大模型接口国内的效果真的很差,现在如果想使用GPT大模型,可以使用微软Azure的OpenAI服务。 负责......
  • NCCL接口测试
    准备知识PyTorch分布式通信的程序包相关的API。torch.distributed.init_process_group(),初始化进程组。torch.distributed.get_rank(),可以获得当前进程的rank,rank%torch.torch.cuda.device_count()可以得到当前节点的ranklocal_rank。torch.distributed.get_world_size()......
  • java实现一个什么都没有的接口有什么用呢?
    在Java中,一个完全没有方法定义的接口被称为标记接口(MarkerInterface)。标记接口不包含任何方法,但它们在代码中传达了某种含义或元信息。它们有以下几种主要用途:语义约定:通过实现一个特定的标记接口,类可以明确地表示它具有某种特性或行为,即使该接口没有定义任何方法。当你看到一个类......
  • 基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程
    (基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程)1Jenkins是什么?学习官网:Jenkins官网,Jenkins中文官网;Jenkins是一款开源CI&CD软件,用于自动化各种任务,包括构建、测试和部署软件;用Java语言编写的,可在Tomcat、Docker等流行的容器中运行,也可独立运行。......