不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:php-note.com  发布于:2022-03-18 18:03  分类:Java基础  编辑

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类型,  

所以在任何包的类中均可以用 “接口.字段” 的形式来使用  

 

 

摘自:https://bbs.csdn.net/topics/310226