Java中interface中定义变量都是"public static final" 类型的,也就是常量,因此很多人在interface定义常用的常量,除此之外单独定义一个class来保存常量也是一个选择,对于这两种方式哪一种好呢?
下面是功能等同的两种定义常量的方式:
public final class Constants { private Constants() {} public static final Integer TIME_OUT = 1000; } public interface Constants { Integer TIME_OUT = 1000; }
类定义常量和接口定义常量:
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文件会更小,而且更简洁,效率更高。
所以,我更喜欢把常量定义在接口中。
【摘自CSDN论坛】遇到一个问题:
interface Foo { int k = 0; } public class Test implements Foo { //...... } public static void main(String args[]) { int i; Test test = new Test(); i = test.k; i = Test.k; i = Foo.k; // 直接访问 接口的字段 !!! } }
答案:Compilation succesds.
我觉得 i = Test.k; 应该出错,因为 k 并不是 Test 的 static变量 啊!
在 interface 中的定义的字段都自动编译为 public final static 类型,可以通过三种方式访问:
1、接口.变量;2、扩展类.变量;3、扩展类的实例.变量。
小衲补充一点:
在interface中的定义的变量都自动说明为 public final static类型,
所以在任何包的类中均可以用 “接口.字段” 的形式来使用