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的区别 总是忘记.
随机推荐
- ios 之CGRectMake
首先要弄懂几个基本的概念. 一)三个结构体:CGPoint.CGSize.CGRect 1. CGPoint [plain] view plaincopy /* Points. */ struc ...
- 使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
使用Auto Layout中的VFL(Visual format language)--代码实现自动布局 2014-12-09 10:56 编辑: zhiwupei 分类:iOS开发 来源:机智的新手 ...
- Bzoj 1083: [SCOI2005]繁忙的都市 (最小生成树)
Bzoj 1083: [SCOI2005]繁忙的都市 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1083 此题是最小瓶颈生成树的裸题. ...
- (15)zabbix ODBC数据库监控
概述 ODBC监控对应于Zabbix Web管理端中的Database monitor监控项类型. ODBC是用于访问数据库管理系统(DBMS)的C语言中间件API.ODBC由Microsoft开发, ...
- OpenWrt 路由器如何让 lan 口主机获得 ipv6 网络访问 -- 知乎
本文转自知乎: OpenWrt 路由器如何让 lan 口主机获得 ipv6 网络访问? - mistforest的回答 - 知乎https://www.zhihu.com/question/29667 ...
- mysql:10道mysql查询语句面试题
表结构 学生表student(id,name) 课程表course(id,name) 学生课程表student_course(sid,cid,score) 创建表的sql代码 ```sql creat ...
- django第11天(分页器)
django第11天分页器 分页模块 批量插入数据 book_list = [] #先生成对象 for i in range(100): book = Book(name = 'book%s'%i,p ...
- windows中阿里的自动化测试macaca安装配置
一.环境配置 node cnpm环境安装 安卓环境配置 参考文档https://macacajs.github.io/zh/environment-setup 全局安装macaca-cli macac ...
- CMDB资源配置管理项目
浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...
- luogu2483 【模板】k短路([SDOI2010]魔法猪学院)
模板题 #include <iostream> #include <cstring> #include <cstdio> #include <queue> ...