最近看到一些代码中把常量放在接口中,我平时是把常量放在常量类中的,因此有所疑惑,去网上查了之后,发现既有人赞成,又有人反对,请 v2 大神指教,到底该不该放在接口中,有什么优势,有什么不好的地方?
1
lambdaxs 2018-10-29 10:57:36 +08:00
常量不可变,放在常量类里省内存
|
2
BBCCBB 2018-10-29 11:00:58 +08:00
看习惯, 放到接口中不用写前面的 public static final
|
3
loshine1992 2018-10-29 11:03:05 +08:00
看你的常量是不是和这个接口相关。
|
4
uxstone 2018-10-29 11:22:27 +08:00 5
|
6
zhangwugui 2018-10-29 15:05:25 +08:00
我一般喜欢放到常量类里,整个 Constants 类存放。
|
7
passerbytiny 2018-10-29 16:17:45 +08:00
@uxstone #4 这个链接跟本主题无关。此链接找出的问题和提供的解决方案,也是过度设计。就算是以前 ant 构建的年代,编译前先 clean 也是惯例,C++上才存在部分编译。
|
8
toku 2018-10-29 16:39:42 +08:00
放在常量类里面,要写 get 方法?
|
9
SilentHill 2018-10-29 16:44:02 +08:00
@jobscolin 当 a 和 b 两个源文件在同一个目录时,a 依赖于 b,如果 b 源码发生变化,当你用 javac 编译 a 的时候,b 也会被编译,你会发现 b.class 要么被创建,要么时间戳被更新。
|
10
yukiww233 2018-10-29 16:57:06 +08:00
@passerbytiny #7 我是觉得这篇文章杠了,照这样说,所有显性隐性声明 static final 的常量都有这个问题,都得包个 getter
@SilentHill #9 是修改并编译“被依赖”的类 |
11
SilentHill 2018-10-29 17:19:46 +08:00
@yukiww233 这篇文章没啥问题。。譬如你自己的代码出来个 jar 包,然后你用了依赖 jar 包里面的一个 static final 常量,如果哪一天依赖 jar 包的这个常量值变了,而且你已知它其他功能和接口没变,这个时候大多数人都会直接将依赖的 jar 包直接替换,那么这个问题就必然会出现。。至于这个文章说每个都加个 get 方法,个人觉得没必要,知道有这个问题,到时候重新编译下自己的包就可以了。
而且我觉得依赖 jar 包里面的常量值变了,如果你还不修改自己的代码,那说明这个常量值的变化对你没什么至关重要的影响,否则的话,必然要修改自己代码,修改自己代码就意味着要重新出 jar 包,就不会有这个问题了。 当然,可能还存在其他情况,我可能没考虑到。 |
12
SilentHill 2018-10-29 17:21:40 +08:00
@yukiww233 对于 5 楼的回复,我看错了。。
|
13
abeholder 2018-10-29 17:26:22 +08:00
自从 java8 之后,接口的功能越来越丰富了 。java8 可以有默认方法也可以有静态带实现的方法。
当时我用的时候就觉得既然都有静态方法了,我接口有些静态方法不想暴露出去还不许我 private 修饰啊? 结果 java9 出来后,接口里面的静态方法果然可以修饰了 。。。 |
14
wemore 2018-10-30 01:35:27 +08:00
额。。。。果然我太奇怪了。老想把常量写到 properties 文件里(笑哭)
|
15
GoForce5500 2018-10-31 20:54:44 +08:00
《 Effective Java 》 3rd, item 22 "Use interfaces only to define types".
至于常量内联,每一个试图替换 Tomcat 里已发布的包含常量类 Class 文件的人都会碰到由此产生的 Bug。 |