最近在看一本书 Java与模式,里面提了一句不建议使用常量接口,甚至举了个java源码的反例,

蛋疼的是没有说为什么?

查了网上一圈发现他们也是知道怎么做而不知道为什么这么做。

然后我只能找谷歌了,翻译后,我把自己理解外加总结的放在下面。

第一

常量类应该是final,不变的,而接口里的参数是final,也是不变的。

那么,看起来接口是放常量没有一定问题,还省去了final的输入,非常的合适。

但是,类是只能单继承的,接口是允许多实现的。

要是类实现的多个接口出现重名的常量,会报错,必须要在实现类明确常量用的是哪个接口的。

虽然这可以说是架构师设计的问题,但是,架构师这么做就违反了依赖倒转原则,这玩意就不细说了。

第二

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

这个应该很少人遇到过,不过这是 Effective Java 里面说的。

具体的理解就是,能被序列化的一定是数据,

那么突然改了数据结构,可能导致老版的数据无法被反序列化,而新版的数据会有冗杂的数据,

要是折腾个几次,网络传输协议 这个无法通过时间或者空间提升的玩意就能逼死你了。

Effective Java 作者 大佬的原话

According to Joshua Bloch, author of "Effective Java":
The constant interface pattern is a poor use of interfaces.
That a class uses some constants internally is an implementation detail.
Implementing a constant interface causes this implementation detail to leak into the class's exported API.
It is of no consequence to the users of a class that the class implements a constant interface.
In fact, it may even confuse them. Worse, it represents a commitment:
if in a future release the class is modified so that it no longer needs to use the constants,
it still must implement the interface to ensure binary compatibility. If a nonfinal class implements a constant interface,
all of its subclasses will have their namespaces polluted by the constants in the interface.

第三

基于数据只暴露给相应的类的原则,一个类实现一个常量接口,可能只需要其中几个常量,而得到了更多无用的常量,

所以,使用常量接口的时候都是

 import static const.valueAAA

那此时和常量类有区别吗?

总结

接口是定义类型的,而不应该用于导出常量。常量接口不建议使用,应使用常量类。

Java的常量接口思考,项目中的常量是放在接口里还是放在类里呢?的更多相关文章

  1. java web项目(spring项目)中集成webservice ,实现对外开放接口

    什么是WebService?webService小示例 点此了解 下面进入正题: Javaweb项目(spring项目)中集成webservice ,实现对外开放接口步骤: 准备: 采用与spring ...

  2. 在objc项目中使用常量的最佳实践

    在objc项目中使用常量的最佳实践   之前,在在objc项目中使用常量中,使用c的预处理#define来设置常量.比如,可以做个头文件,然后在需要的类文件中import,使用常量. 但这不是最佳实践 ...

  3. Java enum枚举在实际项目中的常用方法

    在项目实际开发过程中,经常会遇到对某些固定的值.字典项的定义的需求,很多项目经常使用常量来定义,其实在jdk1.5就已经引入了枚举,使用枚举可以更好的解决这类需求,本文主要记录枚举的优势以及经常在项目 ...

  4. 在.net core web api项目中安装swagger展示api接口(相当于生成api文档)

    1,  建立或打开项目后,在“程序包管理器控制台”中执行以下命令添加包引用: Install-Package Swashbuckle.AspNetCore 2,在项目中打开Startup.cs文件,找 ...

  5. 在webpack搭建的vue项目中如何管理好后台接口地址

    在最近做的vue项目中,使用了webpack打包工具,以前在做项目中测试环境和生产环境的接口地址都是一样的,由于现在接口地址不一样,需要在项目打包的时候手动切换不同的地址,有时候忘记切换就要重新打包, ...

  6. python+pytest接口自动化(16)-接口自动化项目中日志的使用 (使用loguru模块)

    通过上篇文章日志管理模块loguru简介,我们已经知道了loguru日志记录模块的简单使用.在自动化测试项目中,一般都需要通过记录日志的方式来确定项目运行的状态及结果,以方便定位问题. 这篇文章我们使 ...

  7. Maven项目中mvn clean后找不到測试类问题

    在Maven项目中进行单元測试,但mvn clean后又一次mvn install项目,再次进行单元測试.会有下面的错误. <span style="font-family:KaiTi ...

  8. [JAVA IDEA]在使用maven项目中,无法读取resources文件夹中的配置文件的一种解决方案

    1.在通过配置文件来连接数据库时,在resouces文件中放入了db.properties配置文件,但无法正常读取到 读取配置文件信息的代码: InputStream input=JdbcUtil.c ...

  9. SpringBoot项目中使用swagger2暴露resftul接口增加JWT来进行安全性验证

    首先推荐两篇文章: 关于保护RestAPI的一些介绍: http://www.jianshu.com/p/6307c89fe3fa token与session的一些区别漫谈: http://www.j ...

随机推荐

  1. gulp记录

    npm install gulp -g //全局安装gulp gulp -v //此处若有问题,配置环境变量,npm config get prefix得到路径 npm init //新建nodejs ...

  2. BZOJ_5338_ [TJOI2018]xor_可持久化trie

    BZOJ_5338_ [TJOI2018]xor_可持久化trie Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 ...

  3. BZOJ_2467_[中山市选2010]生成树_数学

    BZOJ_2467_[中山市选2010]生成树_数学 [Submit][Status][Discuss] Description 有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成 ...

  4. Node初学者入门,一本全面的NodeJS教程

    作者: Manuel Kiessling  翻译: goddyzhao & GrayZhang & MondayChen 关于 本书致力于教会你如何用Node.js来开发应用,过程中会 ...

  5. TTS API 使用

    #define SPCAT_VOICES           L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices" ...

  6. RDA项目打包

    注意APP的编译搭建: ./aps/Makefile.toolchain //ccoption path的设定 ./aps/rules.mak //统一的编译规则 MAKE -C 1.TOOLS的可执 ...

  7. [hdu2586]How far away?(LCA)

    题意:问树上两点之间的最短距离 解题关键:LCA模板题,在线做法,LCA->RMQ,用st表求解 这里是用first,rmq数组长度可以减半. #include<cstdio> #i ...

  8. POJ-2718

    Smallest Difference Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12158   Accepted: 3 ...

  9. hdu 4123 Bob’s Race (dfs树上最远距离+RMQ)

    C - Bob’s Race Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Subm ...

  10. Socket 阻塞与非阻塞模式

    http://blog.sina.com.cn/s/blog_5d0990c7010115ib.html