Java 使用 interface 定义常量是不是一种很奇怪的操作。。。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hqtc
V2EX    Java

Java 使用 interface 定义常量是不是一种很奇怪的操作。。。

  •  
  •   hqtc 2017-08-15 12:27:52 +08:00 6306 次点击
    这是一个创建于 3055 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原则上好像没什么问题。。

    但是。。interface 里面只有一堆属性,怪怪的啊

    有啥致命的缺点吗

    9 条回复    2017-08-15 18:30:07 +08:00
    nicevar
        1
    nicevar  
       2017-08-15 12:36:16 +08:00   1
    不是太好,编译期会影响,应该不少人踩过这个坑,还有些人踩了也不知道的
    但是有时候在一个已经非常复杂的工程上扩展一些功能,如果新增的常量不会变动的话,写在 interface 里面更清晰简洁,整体改动相对比较少
    microhz
        2
    microhz  
       2017-08-15 15:21:45 +08:00
    接口是行为的抽象,需不需要定义常量要看具体接口用途,例如接口的一些实现可能用到的变量的默认值。你可以参考一些主流框架例如 spring 的高层接口定义的常量是如何定义和使用的。
    lowzoom
        3
    lowzoom  
       2017-08-15 15:29:57 +08:00
    一直都是用 interface 定义常量集合,少写一堆修饰符,爽
    3pmtea
        4
    3pmtea  
       2017-08-15 17:02:33 +08:00
    从 API 设计的角度来说,不好。
    因为你无法阻止其他人 new 或者 implements 你的 interface,虽然这些做法并没有什么实际意义或危害,但毕竟不符合此接口的本意。
    如果用 class,则可以有许多手段来防止其他人对这个 class 名字的误用和滥用。

    至于用 interface 可以少写 static final 这种事情,idea 的 live template 功能可以完美解决。
    lowzoom
        5
    lowzoom  
       2017-08-15 17:30:16 +08:00
    @3pmtea 一个纯常量类里面还要写私有构造方法,丑
    少写的爽不是指少打几个字母,而是指视觉的清爽
    要防止其他人滥用这个接口,方法太多了:
    1. 在 git 合并请求的时候就可以直接拒绝
    2. annotation processor 编译时检查
    3. 程序启动时运行时检查校验
    3pmtea
        6
    3pmtea  
       2017-08-15 18:00:28 +08:00
    @lowzoom
    用 enum,不需要任何额外操作,自动防止滥用
    lowzoom
        7
    lowzoom  
       2017-08-15 18:15:44 +08:00
    @3pmtea enum 多一个分号,还是丑
    3pmtea
        8
    3pmtea  
       2017-08-15 18:28:14 +08:00
    @lowzoom
    6
    还是用 kotlin 吧,比 java 读写起来舒服多了
    hqtc
        9
    hqtc  
    OP
       2017-08-15 18:30:07 +08:00
    @3pmtea 教练,我也要学 Kotlin。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2367 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 15:39 PVG 23:39 LAX 07:39 JFK 10:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86