原文链接 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中好" 的一些思考的更多相关文章

  1. Java中常量定义在interface和class的区别(转)

    最终结论:定义常量在interface和class中其实都行,关键是看你的设计和个人爱好. Java中interface中定义变量默认都是"public static final" ...

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

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

  3. Java中abstract和interface的区别

    abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...

  4. java中接口(interface)和虚基类(abstract class)的区别

    在Java语言中,abstract class和interface是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.abstract class和interfa ...

  5. java中abstract和interface的區別(轉)

    (一)概述    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存 在,才赋予了Java强大的 面向对象能力.abstract ...

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

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

  7. java中自定义注释@interface的用法

    一.什么是注释     说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J ...

  8. 《Java虚拟机原理图解》 1.2、class文件中的常量池

    了解JVM虚拟机原理 是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给 ...

  9. Java常量,变量,对象(字面量)在JVM内存中的存储位置

    Java常量,变量,对象(字面量)在JVM内存中的存储位置 2019-02-26 18:13:09 HD243608836 阅读数 540  收藏 更多 分类专栏: JAVA jvm   苦苦研究了快 ...

随机推荐

  1. LeetCode & Q13-Roman to Integer-Easy

    Math String Description: Given a roman numeral, convert it to an integer. Input is guaranteed to be ...

  2. 第三章 jQuery中的事件与动画

    第三章jQuery中的事件与动画 一. jQuery中的事件 jQuery事件是对javaScript事件的封装. 1.基础事件 在javaScript中,常用的基础事件有鼠标事件.键盘事件.wind ...

  3. python中 return 的用法

    return 语句就是讲结果返回到调用的地方,并把程序的控制权一起返回 程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return. 要返回两个数值,写成一行即可: de ...

  4. Hadoop学习笔记一(HDFS架构)

    介绍 Hadoop分布式文件系统(HDFS)设计的运行环境是商用的硬件系统.他和现存的其他分布式文件系统存在很多相似点.不过HDFS和其他分布式文件系统的区别才是他的最大亮点,HDFS具有高容错的特性 ...

  5. Docker学习笔记 - Docker的容器

    docker logs  [-f]  [-t]  [--tail]  容器名 -f -t --tail="all" 无参数:返回所有日志 -f 一直跟踪变化并返回 -t 带时间戳返 ...

  6. Codeforces Round #426 (Div. 2)

    http://codeforces.com/contest/834 A. The Useless Toy 题意: <,>,^,v这4个箭头符号,每一个都可以通过其他及其本身逆时针或者顺时针 ...

  7. Java-NIO(五):通道(Channel)的数据传输与内存映射文件

    通道(Channel)的数据传输(采用非直接缓冲区) @Test public void testChannel() throws IOException { FileInputStream file ...

  8. POJ-1861 Network---最小生成树

    题目链接: https://vjudge.net/problem/POJ-1861 题目大意: 有一些公司,公司之间需要连接起来.给出了哪些公司可以连接以及连接边的长度.求最小生成树中最大的边,以及最 ...

  9. Vue还有这种操作?浅析几个新手常常忽略的API

    一:实现子组件与父组件双向绑定的"sync": 一般来说,我们实现父子组件值的传递通常使用的是[props]和自定义事件[$emit].父组件通过[props]将值传给子组件,子组 ...

  10. 处处留心皆学问——由“display:inline-block;”导致的间距引发的思考。

    昨天在做一个demo时遇到了一个问题:我有五个li需要并排排列,然后自然而然的我给它们设了display:inline-block;但是,过了很久之后发现,除了我写的样式外,它默认有一个间距,我们都不 ...