最终结论:定义常量在interface和class中其实都行,关键是看你的设计和个人爱好。

Java中interface中定义变量默认都是"public static final"类型的,也就是常量,因此很多人在interface定义常用的常量。

下面是功能等同的两种定义常量的方式:

class:

package com.example;

public final class Constants {
private Constants() {}
public static final int A = ;
public static final int B = ;
public static final int C = ;
public static final int D = ;
}

interface:

package com.example;

public interface Constants {
int A = ;
int B = ;
int C = ;
int D = ;

类定义常量和接口定义常量:

1、类定义常量,需要定义成final且定义一个private的构造方法,这样做是为了不让其他类继承,禁止实例化此类,调用时直接以"类.常量"的方式调用。

2、接口中定义的"变量",其实就是常量,接口中的"变量"默认都是 "public static final"类型,即为常量,因此接口可以省略"public static final"而直接写成 "type variable"。

3、用如上的类定义常量,不能实例化也不能被继承,看起来完美无缺。

4、接口定义常量,虽不能实例化,确可以被其他类实现;

因此有这么一种设计模式"The constant interface pattern". 所谓的"常量接口模式", 就是其他类要使用接口中定义的常量,就实现该接口. 我认为这是对接口的烂用. 接口中定义的常量应为所有类频繁使用的常量,但并不是每个类都使用了接口中定义的所有常量,因而导入了不必要的常量到这个类中,并且导入后这个类的子类也会基础导入的常量,这样会导致混乱,应当避免此种用法。

5、在interface和class中定义相同的常量,interface生成的class文件比class生成的class文件会更小,而且更简洁,效率更高。可以使用jad和javap反编译去分析一下。

个人总结:

1、不要使用"常量接口模式",此模式会导致类中的常量混乱,增加维护难度。注意!是常量接口模式时不要使用,而对于普通的设计是可以使用接口去实现的。

2、不要使用静态导入,import static *****,因为import static会导致可维护性下降,维护的人看代码时,不是那么清楚或者不那么迅速的知道这个常量位于哪个文件中。建议使用常量的地方直接 "接口.常量名" 的方式使用。

3、还有用这种方式定义常量: public abstract class Constants {},很容易看出这种方式定义常量的目的:禁止实例化。但是"abstract class"的目的是为了让其他类继承,因此语意别扭,同样具有interface定义常量的确定,即可以被继承, 其实解决上述问题更优美的方式是用final修饰类并给类定义一个private构造方法。

4、对于用是用interface定义常量还是使用class定义常量,看个人喜好. 个人觉得interface定义常量更为优美:代码更简洁, 生成的class文件更小,JVM不要考虑类的附加特性,如方法重载等,因而更为高效。这是一种反模式的用法,很多人不喜欢这种用法,如果我们知道它的优缺点,延长避短,也是无可厚非的,还有一点是不要把这种用法用成"常量接口模式",个人觉得"常量接口模式"确实是一种对interface的"pool use"。

参考:

http://blog.csdn.net/voo00oov/article/details/50433672(以上内容转自此篇文章)

http://my.oschina.net/gschen/blog/134794?fromerr=zKrZIUb5

http://stackoverflow.com/questions/2659593/what-is-the-use-of-interface-constants

http://www.ibm.com/developerworks/cn/java/l-java-interface/index.html

http://blog.csdn.net/pan_junbiao/article/details/5906745

Java中常量定义在interface和class的区别(转)的更多相关文章

  1. java中常量定义在interface中好还是定义在class中

    Java中interface中定义变量都是"public static final" 类型的, 也就是常量, 因此很多人在interface定义常用的常量,除此之外单独定义一个cl ...

  2. 关于 "java中常量定义在interface中好还是定义在class中好" 的一些思考

    原文链接 http://blog.csdn.net/voo00oov/article/details/50433672 java中interface中定义变量都是"public static ...

  3. 转:Java中abstract和interface的区别

    转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...

  4. java中常量文件的配置与读取

    java中常量文件的配置与读取: package com.floor.shop.user.util; import java.io.InputStream; import java.io.InputS ...

  5. java中String new和直接赋值的区别

        Java中String new和直接赋值的区别     对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才 ...

  6. 转 Java中final、finally、finalize的区别与用法

    Java中final.finally.finalize的区别与用法   1.简单区别:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承.finally是异常处理语句结构 ...

  7. Java中public,private,protected,和默认的区别

    Java中public,private,protected,和默认的区别 1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以 ...

  8. 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别

    Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...

  9. java中public与private还有protect的区别

    java中public与private还有protect的区别 总是忘记.

随机推荐

  1. Linux实现删除撤回的方法。

    RM命令改造 vim /etc/bashrc   在文件的最前端添加如下代码   #修改rm命令 alias rm=delete  #命令别名,通过delete来实现rm改为mv alias r=de ...

  2. 我的Python分析成长之路9

    pandas入门 统计分析是数据分析的重要组成部分,它几乎贯穿整个数据分析的流程.运用统计方法,将定量与定性结合,进行的研究活动叫做统计分析.而pandas是统计分析的重要库. 1.pandas数据结 ...

  3. PYDay9-正则表达式、计算器

    1.什么是正则表达式? 正则表达式,又称规则表达式,是一门小型的语言,通常被用来检索.替换那些符合某个模式(规则)的文本. 2.匹配字符: . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线 ...

  4. luogu3159 [CQOI2012]交换棋子

    把每个点拆成 x y z 对于第 i 个点,x->y是表示流入的,y->z是表示流出的. #include <iostream> #include <cstring> ...

  5. Leetcode 322.零钱兑换

    零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: co ...

  6. nginx的详解(二)

    查看几个设置 nginx正则表达式常用的是前6个 ^: 匹配字符串的开始位置: $:匹配字符串的结束位置:.*: .匹配任意字符,*匹配数量0到正无穷: \. 斜杠用来转义,\.匹配 . 特殊使用方法 ...

  7. TheBrain8破解方式

    破解文件下载地址:http://rghost.net/51736270 mac破解方式: 我用的MAC 装的8007版本的,今天竟然提示要升级专业版本了.补救方法是,先打开TB,把之前手贱输入的云服务 ...

  8. Mysql 主外键与索引之间的区别和联系

    系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部 ...

  9. 【bzoj3696】化合物 树形dp

    题目描述 首长NOI惨跪,于是去念文化课了.现在,他面对一道化学题.这题的来源是因为在一个奇怪的学校两个化竞党在玩一个奇怪的博弈论游戏.这个游戏很蛋疼,我相信你们也没有兴趣听.由于这个游戏涉及博弈论, ...

  10. 【bzoj4200】[Noi2015]小园丁与老司机 STL-map+dp+有上下界最小流

    题目描述 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面.田野上有 nn 棵许愿树,编号 1,2,3,…,n1,2,3,…,n,每棵树可以看作平面上的一个点,其中第 ii 棵树 (1≤ ...