Java中常量定义在interface和class的区别(转)
最终结论:定义常量在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的区别(转)的更多相关文章
- java中常量定义在interface中好还是定义在class中
Java中interface中定义变量都是"public static final" 类型的, 也就是常量, 因此很多人在interface定义常用的常量,除此之外单独定义一个cl ...
- 关于 "java中常量定义在interface中好还是定义在class中好" 的一些思考
原文链接 http://blog.csdn.net/voo00oov/article/details/50433672 java中interface中定义变量都是"public static ...
- 转:Java中abstract和interface的区别
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
- java中常量文件的配置与读取
java中常量文件的配置与读取: package com.floor.shop.user.util; import java.io.InputStream; import java.io.InputS ...
- java中String new和直接赋值的区别
Java中String new和直接赋值的区别 对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才 ...
- 转 Java中final、finally、finalize的区别与用法
Java中final.finally.finalize的区别与用法 1.简单区别:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承.finally是异常处理语句结构 ...
- Java中public,private,protected,和默认的区别
Java中public,private,protected,和默认的区别 1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以 ...
- 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别
Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...
- java中public与private还有protect的区别
java中public与private还有protect的区别 总是忘记.
随机推荐
- 获得Java中System对应一些属性值
public static void main(String[] args){ System.out.println("Java运行时环境版本:\n"+System.getProp ...
- window nodejs 版本管理器 nvm-windows 教程
先去https://github.com/coreybutler/nvm-windows/releases 下载nvm-setup.zip 安装 安装的过程中会提示是否获取nodejs的管理权限,点确 ...
- js最高效的数组去重方法
var arr=[1,2,33,2,4,5,33,5,7,8,1,3];var result=[];var temp={};for( var i=0;i<arr.length;i++){ if( ...
- 【DB_MySQL】 limit——取查询结果的子集
语法:select * from student limit beginIndex,length; 这里结果集的下标同数组一样从0开始,beginIndex表示起始位置,length表示从beginI ...
- easyUI 之datagrid 在前端自定义排序
首先先来看一下,直接从后台读取数据并展示到前端的列表,后端传回的数据是“按商品ID倒序排列” 前端源代码 $('#good_tables').datagrid({ nowrap: true, auto ...
- Linux-ngnix服务(二)
Nginx介绍 特性: 模块化设计,较好的扩展性 高可靠性 支持热部署:不停机更新配置文件,升级版本,更换日志文件 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存 ...
- java foreach的实现原理
http://blog.csdn.net/moqihao/article/details/51078464 本质是通过集合的iterator方式实现,所以再使用foreach集合,要强制判断集合的是否 ...
- cf891a Pride
倘若存在 1,那么答案是 \(n-cnt_1\). 否则,设最短的公约数为 1 的区间长度为 \(minlen\),答案是 \(minlen-1+n-1\). #include <iostrea ...
- unittest和pytest对比
一.用例编写规则 1.unittest提供了test cases.test suites.test fixtures.test runner相关的类,让测试更加明确.方便.可控.使用unittest编 ...
- unittest编写Web测试用例
案例:百度搜索关键词:“unittest” test_baidu.py: from selenium import webdriver from time import sleep import un ...