V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jobscolin
V2EX  ›  Java

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

  •  1
     
  •   jobscolin · 2018-10-29 10:51:32 +08:00 · 6320 次点击
    这是一个创建于 2219 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    结果 java9 出来后,接口里面的静态方法果然可以修饰了 。。。
    wemore
        14
    wemore  
       2018-10-30 01:35:27 +08:00
    额。。。。果然我太奇怪了。老想把常量写到 properties 文件里(笑哭)
    GoForce5500
        15
    GoForce5500  
       2018-10-31 20:54:44 +08:00
    《 Effective Java 》 3rd, item 22 "Use interfaces only to define types".
    至于常量内联,每一个试图替换 Tomcat 里已发布的包含常量类 Class 文件的人都会碰到由此产生的 Bug。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3451 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:36 · PVG 19:36 · LAX 03:36 · JFK 06:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.