Java 常量应该放在接口中还是常量类中???

2018-10-29 10:51:32 +08:00
 jobscolin

最近看到一些代码中把常量放在接口中,我平时是把常量放在常量类中的,因此有所疑惑,去网上查了之后,发现既有人赞成,又有人反对,请 v2 大神指教,到底该不该放在接口中,有什么优势,有什么不好的地方?

6187 次点击
所在节点    Java
15 条回复
lambdaxs
2018-10-29 10:57:36 +08:00
常量不可变,放在常量类里省内存
BBCCBB
2018-10-29 11:00:58 +08:00
看习惯, 放到接口中不用写前面的 public static final
loshine1992
2018-10-29 11:03:05 +08:00
看你的常量是不是和这个接口相关。
uxstone
2018-10-29 11:22:27 +08:00
jobscolin
2018-10-29 15:02:13 +08:00
@uxstone 你这个靠谱吗?为什么我测试了一下,更改接口中常量的值之后,打印结果没问题?
zhangwugui
2018-10-29 15:05:25 +08:00
我一般喜欢放到常量类里,整个 Constants 类存放。
passerbytiny
2018-10-29 16:17:45 +08:00
@uxstone #4 这个链接跟本主题无关。此链接找出的问题和提供的解决方案,也是过度设计。就算是以前 ant 构建的年代,编译前先 clean 也是惯例,C++上才存在部分编译。
toku
2018-10-29 16:39:42 +08:00
放在常量类里面,要写 get 方法?
SilentHill
2018-10-29 16:44:02 +08:00
@jobscolin 当 a 和 b 两个源文件在同一个目录时,a 依赖于 b,如果 b 源码发生变化,当你用 javac 编译 a 的时候,b 也会被编译,你会发现 b.class 要么被创建,要么时间戳被更新。
yukiww233
2018-10-29 16:57:06 +08:00
@passerbytiny #7 我是觉得这篇文章杠了,照这样说,所有显性隐性声明 static final 的常量都有这个问题,都得包个 getter
@SilentHill #9 是修改并编译“被依赖”的类
SilentHill
2018-10-29 17:19:46 +08:00
@yukiww233 这篇文章没啥问题。。譬如你自己的代码出来个 jar 包,然后你用了依赖 jar 包里面的一个 static final 常量,如果哪一天依赖 jar 包的这个常量值变了,而且你已知它其他功能和接口没变,这个时候大多数人都会直接将依赖的 jar 包直接替换,那么这个问题就必然会出现。。至于这个文章说每个都加个 get 方法,个人觉得没必要,知道有这个问题,到时候重新编译下自己的包就可以了。

而且我觉得依赖 jar 包里面的常量值变了,如果你还不修改自己的代码,那说明这个常量值的变化对你没什么至关重要的影响,否则的话,必然要修改自己代码,修改自己代码就意味着要重新出 jar 包,就不会有这个问题了。

当然,可能还存在其他情况,我可能没考虑到。
SilentHill
2018-10-29 17:21:40 +08:00
@yukiww233 对于 5 楼的回复,我看错了。。
abeholder
2018-10-29 17:26:22 +08:00
自从 java8 之后,接口的功能越来越丰富了 。java8 可以有默认方法也可以有静态带实现的方法。

当时我用的时候就觉得既然都有静态方法了,我接口有些静态方法不想暴露出去还不许我 private 修饰啊?

结果 java9 出来后,接口里面的静态方法果然可以修饰了 。。。
wemore
2018-10-30 01:35:27 +08:00
额。。。。果然我太奇怪了。老想把常量写到 properties 文件里(笑哭)
GoForce5500
2018-10-31 20:54:44 +08:00
《 Effective Java 》 3rd, item 22 "Use interfaces only to define types".
至于常量内联,每一个试图替换 Tomcat 里已发布的包含常量类 Class 文件的人都会碰到由此产生的 Bug。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/502085

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX