含义
import static(静态引用)
是Java1.5引入的一个新语法。
之前我们如果想调用一个类里的静态变量,需要首先import
这个类,再使用类名.成员名
的方式:
import com.demo.Domain; // import 类
public class Demo {
public static void main(String[] args) {
System.out.println(Domain.DATA); // 需要使用: 类名.成员名
}
}```
使用`import static`可以省略类名,使得代码编写的更加简洁:
import com.demo.Domain.DATA; // import 类
public class Demo {
public static void main(String[] args) {
System.out.println(DATA); // 直接使用静态变量名
}
}```
一个设计原则
想象一下,我们设计了一个常量接口:
public interface Constants {
String HELLO = "hello";
String WORLD = "world";
String MAN = "man";
String WOMAN = "woman";
}
为了引用它的成员,有些人可能会定义一个class继承这个接口。那么,本来只是想引用这些静态成员来实现这个class内部逻辑,却使得它们作为这个class的一部分,对外暴露给其他的class了,这叫做:Constant Interface Antipattern(请参考《effective java》)
public class Constants implements Constants {
}
正确的做法是使用import
引用这个常量接口或者静态成员(全部或部分),has a
比is a
在这种场景下更合适。
用法
首先,不可滥用!
由于import static
会省略静态成员的类名,违背了面向对象的原则。如果使用不当,势必会造成代码可读性和可维护性的下降。
那么,该何时使用呢?
只有在多次使用同一个类的静态成员时,为使代码简洁,并且不会造成代码混乱时。
其实,当我在阅读spring-boot源码时,发现很少使用import static
,用的最多的地方就是在单元测试中了:
import static org.assertj.core.api.Assertions.assertThat;
@Test
public void excludeSimple(Set result) throws ArtifactFilterException {
assertThat(result).isEmpty();
}
最后,import static
在平时的场合使用其实并不多,使用时需谨慎!
参考官网:
https://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html