浅谈 Java 中的 import static 使用方式
import static
基本介绍
import static
的作用是把某个类中的 静态方法 直接引入当前类的作用域,从而在调用时可以省略类名前缀。当然,import static
在 Java 中不仅可以导入 静态方法,还可以导入 静态变量 / 静态常量 / 静态内部类 / 静态枚举成员。
✅ 能导入的内容
-
静态方法
import static java.util.Objects.requireNonNull;String s = requireNonNull("abc");
-
静态常量 / 变量
import static java.lang.Math.PI; import static java.lang.Math.E;double area = PI * r * r;
-
静态内部类
import static java.util.Map.Entry;for (Entry<String, String> e : map.entrySet()) {System.out.println(e.getKey()); }
-
枚举常量
import static java.time.DayOfWeek.*;DayOfWeek today = MONDAY; if (today == FRIDAY) {System.out.println("Weekend is coming!"); }
❌ 不能导入的内容
- 实例方法 / 实例变量(因为它们依赖对象实例,不能通过
ClassName.method()
直接调用)。 - 构造方法(构造函数本来就不能被继承或静态调用)。
总之,import static
可以导入 类中所有的静态成员(方法、常量、内部类、枚举值),但不能导入需要对象实例才能访问的成员(实例方法、实例变量)。
测试案例
下面通过一个小 Demo,把 静态方法 / 静态常量 / 静态内部类 / 枚举常量 的 import static
用法都使用一遍。
package per.mjn.demo;import static java.lang.Math.*; // 导入静态常量 & 方法
import static java.util.Map.Entry; // 导入静态内部类
import static java.time.DayOfWeek.*; // 导入枚举常量
import static java.util.Objects.requireNonNull; // 导入静态方法import java.time.DayOfWeek;
import java.util.HashMap;
import java.util.Map;public class StaticImportDemo {public static void main(String[] args) {// 1. 使用静态常量 (Math.PI, Math.E)double r = 2.0;double area = PI * pow(r, 2); // 直接用 PI 和 pow()System.out.println("圆面积: " + area);System.out.println("自然常数 e: " + E);// 2. 使用静态方法 (Objects.requireNonNull)String s = requireNonNull("Hello");System.out.println("字符串: " + s);// 3. 使用静态内部类 (Map.Entry)Map<String, Integer> scores = new HashMap<>();scores.put("Alice", 95);scores.put("Bob", 88);for (Entry<String, Integer> e : scores.entrySet()) {System.out.println(e.getKey() + " -> " + e.getValue());}// 4. 使用枚举常量 (DayOfWeek.MONDAY, FRIDAY)DayOfWeek today = MONDAY; // 直接用 MONDAY 而不是 DayOfWeek.MONDAYif (today == FRIDAY) {System.out.println("周五啦,周末快到了!");} else {System.out.println("今天是: " + today);}}
}
输出示例
圆面积: 12.566370614359172
自然常数 e: 2.718281828459045
字符串: Hello
Bob -> 88
Alice -> 95
今天是: MONDAY
这样我们就能看到 import static
的四种典型用法:
- Math.PI / Math.pow(静态常量 & 方法)
- Objects.requireNonNull(静态方法)
- Map.Entry(静态内部类)
- DayOfWeek.MONDAY(枚举常量)
static import
最佳实践
✅ 推荐使用的场景
-
工具类中的语义明确方法 / 常量
-
方法名/常量名独特,不容易和其他类冲突。
-
例子:
import static java.util.Objects.requireNonNull; import static java.lang.Math.PI;double area = PI * r * r; String s = requireNonNull("hello");
-
-
常量集合 / 枚举常量
-
写法更简洁,尤其是枚举。
-
例子:
import static java.time.DayOfWeek.*;DayOfWeek today = MONDAY;
-
-
单元测试断言 / Mock 框架
-
测试代码可读性提升明显。
-
例子:
import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*;assertEquals(42, result); verify(service, times(1)).doSomething();
-
-
DSL 风格 API
-
让代码更“自然语言化”,常见于流式 API / 匹配器。
-
例子:
import static java.util.stream.Collectors.toList;List<String> names = users.stream().map(User::getName).collect(toList());
-
❌ 不推荐使用的场景
-
方法名太通用: 比如
get()
、set()
、build()
,看不出来源,建议保留类前缀:BuilderUtils.build()
。 -
多个类里有相同名字的方法/常量:例如
StringUtils.isEmpty()
和CollectionUtils.isEmpty()
,同时 static import 会冲突,建议只保留类名前缀。 -
通配符导入过多:
import static xxx.*;
在业务代码中容易引入过多方法,影响可读性和维护。测试代码里可以接受,但业务代码里建议只导入需要的成员。
📝 建议
-
业务代码:精确导入,控制范围,保证可读性。
-
测试代码:可以大胆用,尤其是断言、Mock。
-
团队规范:建议在 Code Style 文档里约定:
- 允许测试类使用
import static ...*
。 - 业务代码必须显式导入具体方法或常量,不允许
*
。
- 允许测试类使用
总之,能让代码更清晰就用,可能让人困惑就不用。