jobscolin
V2EX  ›  Java

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

  •  1
     
  •   jobscolin · Oct 29, 2018 · 6890 views
    This topic created in 2780 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    结果 java9 出来后,接口里面的静态方法果然可以修饰了 。。。
    wemore
        14
    wemore  
       Oct 30, 2018
    额。。。。果然我太奇怪了。老想把常量写到 properties 文件里(笑哭)
    GoForce5500
        15
    GoForce5500  
       Oct 31, 2018
    《 Effective Java 》 3rd, item 22 "Use interfaces only to define types".
    至于常量内联,每一个试图替换 Tomcat 里已发布的包含常量类 Class 文件的人都会碰到由此产生的 Bug。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3148 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 14:19 · PVG 22:19 · LAX 07:19 · JFK 10:19
    ♥ Do have faith in what you're doing.