当前位置: 首页 > news >正文

浅谈 Java 中的 import static 使用方式

import static 基本介绍

import static 的作用是把某个类中的 静态方法 直接引入当前类的作用域,从而在调用时可以省略类名前缀。当然,import static 在 Java 中不仅可以导入 静态方法,还可以导入 静态变量 / 静态常量 / 静态内部类 / 静态枚举成员

✅ 能导入的内容

  1. 静态方法

    import static java.util.Objects.requireNonNull;String s = requireNonNull("abc");
    
  2. 静态常量 / 变量

    import static java.lang.Math.PI;
    import static java.lang.Math.E;double area = PI * r * r;
    
  3. 静态内部类

    import static java.util.Map.Entry;for (Entry<String, String> e : map.entrySet()) {System.out.println(e.getKey());
    }
    
  4. 枚举常量

    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 最佳实践

✅ 推荐使用的场景

  1. 工具类中的语义明确方法 / 常量

    • 方法名/常量名独特,不容易和其他类冲突。

    • 例子:

      import static java.util.Objects.requireNonNull;
      import static java.lang.Math.PI;double area = PI * r * r;
      String s = requireNonNull("hello");
      
  2. 常量集合 / 枚举常量

    • 写法更简洁,尤其是枚举。

    • 例子:

      import static java.time.DayOfWeek.*;DayOfWeek today = MONDAY;
      
  3. 单元测试断言 / Mock 框架

    • 测试代码可读性提升明显。

    • 例子:

      import static org.junit.jupiter.api.Assertions.*;
      import static org.mockito.Mockito.*;assertEquals(42, result);
      verify(service, times(1)).doSomething();
      
  4. DSL 风格 API

    • 让代码更“自然语言化”,常见于流式 API / 匹配器。

    • 例子:

      import static java.util.stream.Collectors.toList;List<String> names = users.stream().map(User::getName).collect(toList());
      

❌ 不推荐使用的场景

  1. 方法名太通用: 比如 get()set()build(),看不出来源,建议保留类前缀:BuilderUtils.build()

  2. 多个类里有相同名字的方法/常量:例如 StringUtils.isEmpty()CollectionUtils.isEmpty(),同时 static import 会冲突,建议只保留类名前缀。

  3. 通配符导入过多import static xxx.*; 在业务代码中容易引入过多方法,影响可读性和维护。测试代码里可以接受,但业务代码里建议只导入需要的成员。

📝 建议

  • 业务代码:精确导入,控制范围,保证可读性。

  • 测试代码:可以大胆用,尤其是断言、Mock。

  • 团队规范:建议在 Code Style 文档里约定:

    • 允许测试类使用 import static ...*
    • 业务代码必须显式导入具体方法或常量,不允许 *

总之,能让代码更清晰就用,可能让人困惑就不用。

http://www.dtcms.com/a/355405.html

相关文章:

  • Docker 是什么?
  • RabbitMQ-高级特性
  • 机器视觉学习-day09-图像矫正
  • 客户预充值系统(一) - 数据库设计与数据插入
  • JVM——八股文
  • curl、python-requests、postman和jmeter的对应关系
  • DJI无人机云哨DroneID技术解析:天空中的数字身份证
  • 2025年KBS SCI1区TOP,矩阵差分进化算法+移动网络视觉覆盖无人机轨迹优化,深度解析+性能实测
  • Maven核心用法
  • ubuntu挂载外接硬盘
  • IDEA 中创建 Springboot 项目没有 Java8 选项的解决办法
  • 介绍智慧城管十大核心功能之一:风险预警系统
  • 关于npm安装electron和better-sqlite3失败问题
  • Copilot、Cursor、Trae、ChatGPT 的“四件套”场景选择表
  • 第六届智能计算与人机交互国际研讨会(ICHCI 2025)
  • MySQL 与 ClickHouse 深度对比:架构、性能与场景选择指南
  • 【数字IC后端】引导时钟树CTS的生成方向之anchor driver
  • 详细介绍Linux 内存管理struct page数据结构中的_count和_mapcount有什么区别?
  • Pyomo、PuLP 和 OR-Tools 解决约束优化问题效率对比
  • C# SIMD编程实践:工业数据处理性能优化案例
  • 基于SpringBoot的校园资料分享系统【2026最新】
  • 数据结构-哈夫曼树和B树
  • 安宝特方案丨安宝特工业AR全链路解决方案
  • Centos 8 磁盘扩展xfs文件系统 (LVM)
  • 利用 Java 爬虫获取 AQI 详情数据(代码示例)实战指南
  • 如何使用Windows自带的PnPUtil命令来禁用/停用和启用硬件设备
  • VPC私有域名解析DNS
  • 使用 Action 自动部署 VuePress 到 GitHub Pages
  • GRE隧道IPv6过渡技术
  • 数制与编码