关于 "java中常量定义在interface中好还是定义在class中好" 的一些思考
原文链接 http://blog.csdn.net/voo00oov/article/details/50433672
java中interface中定义变量都是"public static final" 类型的, 也就是常量, 因此很多人在interface定义常用的常量(这也是本人偏爱的方式);
由此却引起了不少风波, 网上关于此问题的讨论也非常多, 下面说说我的个人意见:
下面是功能等同的两种定义常量的方式:
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 = ;
}
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文件会更小, 而且更简洁, 效率更高.
总结:
1. 不要使用"常量接口模式", 此模式会导致类中的常量混乱, 增加维护难度.
2. 不要使用静态导入, import static *****
我非常不赞同这种使用常量的方法, 因为import static会导致可维护性下降, 维护的人看代码时, 不是那么清楚或者不那么迅速的知道这个常量位于哪个文件中.
建议使用常量的地方直接 "接口.常量名" 的方式使用
3. 还有人说 用这种方式定义常量: public abstract class Constants {}, 很容易看出这种方式定义常量的目的: 禁止实例化.
但是"abstract class"的目的是为了让其他类继承, 因此语意别扭, 同样具有interface定义常量的确定 ----- 即可以被继承,
其实解决上述问题更优美的方式是用final修饰类并给类定义一个private构造方法.
4. 对于用是用interface定义常量还是使用class定义常量, 看个人喜好. 个人觉得interface定义常量更为优美,
1. 代码更简洁
2. 生成的class文件更小, jvm不要考虑类的附加特性, 如方法重载等, 因而更为高效.
tips: 这是一种反模式的用法, 很多人不喜欢这种用法, 如果我们知道它的优缺点, 延长避短, 也是无可厚非的,
还有一点是不要把这种用法用成"常量接口模式", 个人觉得"常量接口模式"确实是一种对interface的"pool use".
相关阅读
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
关于 "java中常量定义在interface中好还是定义在class中好" 的一些思考的更多相关文章
- Java中常量定义在interface和class的区别(转)
最终结论:定义常量在interface和class中其实都行,关键是看你的设计和个人爱好. Java中interface中定义变量默认都是"public static final" ...
- 转:Java中abstract和interface的区别
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
- Java中abstract和interface的区别
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...
- java中接口(interface)和虚基类(abstract class)的区别
在Java语言中,abstract class和interface是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.abstract class和interfa ...
- java中abstract和interface的區別(轉)
(一)概述 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存 在,才赋予了Java强大的 面向对象能力.abstract ...
- java中常量文件的配置与读取
java中常量文件的配置与读取: package com.floor.shop.user.util; import java.io.InputStream; import java.io.InputS ...
- java中自定义注释@interface的用法
一.什么是注释 说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J ...
- 《Java虚拟机原理图解》 1.2、class文件中的常量池
了解JVM虚拟机原理 是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给 ...
- Java常量,变量,对象(字面量)在JVM内存中的存储位置
Java常量,变量,对象(字面量)在JVM内存中的存储位置 2019-02-26 18:13:09 HD243608836 阅读数 540 收藏 更多 分类专栏: JAVA jvm 苦苦研究了快 ...
随机推荐
- LeetCode & Q13-Roman to Integer-Easy
Math String Description: Given a roman numeral, convert it to an integer. Input is guaranteed to be ...
- 第三章 jQuery中的事件与动画
第三章jQuery中的事件与动画 一. jQuery中的事件 jQuery事件是对javaScript事件的封装. 1.基础事件 在javaScript中,常用的基础事件有鼠标事件.键盘事件.wind ...
- python中 return 的用法
return 语句就是讲结果返回到调用的地方,并把程序的控制权一起返回 程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return. 要返回两个数值,写成一行即可: de ...
- Hadoop学习笔记一(HDFS架构)
介绍 Hadoop分布式文件系统(HDFS)设计的运行环境是商用的硬件系统.他和现存的其他分布式文件系统存在很多相似点.不过HDFS和其他分布式文件系统的区别才是他的最大亮点,HDFS具有高容错的特性 ...
- Docker学习笔记 - Docker的容器
docker logs [-f] [-t] [--tail] 容器名 -f -t --tail="all" 无参数:返回所有日志 -f 一直跟踪变化并返回 -t 带时间戳返 ...
- Codeforces Round #426 (Div. 2)
http://codeforces.com/contest/834 A. The Useless Toy 题意: <,>,^,v这4个箭头符号,每一个都可以通过其他及其本身逆时针或者顺时针 ...
- Java-NIO(五):通道(Channel)的数据传输与内存映射文件
通道(Channel)的数据传输(采用非直接缓冲区) @Test public void testChannel() throws IOException { FileInputStream file ...
- POJ-1861 Network---最小生成树
题目链接: https://vjudge.net/problem/POJ-1861 题目大意: 有一些公司,公司之间需要连接起来.给出了哪些公司可以连接以及连接边的长度.求最小生成树中最大的边,以及最 ...
- Vue还有这种操作?浅析几个新手常常忽略的API
一:实现子组件与父组件双向绑定的"sync": 一般来说,我们实现父子组件值的传递通常使用的是[props]和自定义事件[$emit].父组件通过[props]将值传给子组件,子组 ...
- 处处留心皆学问——由“display:inline-block;”导致的间距引发的思考。
昨天在做一个demo时遇到了一个问题:我有五个li需要并排排列,然后自然而然的我给它们设了display:inline-block;但是,过了很久之后发现,除了我写的样式外,它默认有一个间距,我们都不 ...