这里不去讲常量究竟是定义在interface中优还是定义在class中好,下面是个人的理解与分享...
class中定义:
public interface TestB {
String NAME = "test";
String SEX = "test";
}
interface中定义
public fianl class TestA {
//私有构造方法
private TestA(){};
public static final String Name = "test";
public static final String SEX = "test";
}
class中调用的方式:
1.采用“类名.常量名”方法进行调用;
2.需要私有构造方法,避免创建实例对象;
3.同时不能被其他类继承;
4.常量的类型定义为public final static;
interface中调用方法:
1.在interface中声明的字段,虚拟机在编译时自动加上public static final修饰符;
2.一般调用“接口名.常量名”;
3.还有一种是实现该接口,叫做“接口常量模式”,这种模式是对接口的不良使用;
接口常量模式:
常量接口模式是对java接口的一种poor use。一个类内部的使用这些常量是一个实现细节。当一个类实现了该接口,那么这个接口就会成为该类公共API的一部分。这个类的内部实现细节不应该暴露给公共API。这个类是否实现了一个常量接口对于用户来说是无关紧要的。事实上,这种做法可能会混淆用户。更糟糕的是,它表现为一种义务:如果在未来的发行版中不需要再使用那些常量,但是为了兼容性该类还是需要实现这个接口。如果一个nonfinal类实现了一个常量接口,那么这个常量接口中定义的常量将会污染他的所有子类的的命名空间。在java平台的一些类库如java.io.ObjectStreamConstants中,也有很多这种常量接口。但是这些接口应该被看作是不合规范的,并且避免大家效仿这种做法。
为什么interface中定义的成员变量默认是“fianl static”?
所谓的接口就是一些协议,契约的定义,他不能包含任何实现,所以为了避免实现类去修改这个契约,必须定义成final,另外接口也不能被实例化,所以只能通过static声明,才能使用接口名+字段这样一种方式来访问成员变量.
总结:
- interface中的定义代码量更少,而class中相对多点,修饰符的原因;
- interface生成的class文件比class生成的class文件小点,代码简洁高效;
- 不要使用接口常量模式,容易造成常量混乱,维护性差;
- 不要使用静态导入“import static....”,代码不易读,不清楚常量是哪个文件中的;
网友评论