讲师中心 微信公众号
AI工具推荐 视频效率加速

详解Java中的迪米特法则 (LoD)_最少知道原则在类设计中的体现

星芳大大_1638

星芳大大_1638

发布时间:2026-02-26 14:44:40

|

120人浏览过

|

来源于php中文网

原创

LoD的核心是“少暴露依赖”而非“少写代码”,即类只与直接朋友(this、参数、方法内new对象)通信,避免链式调用如order.getCustomer().getAddress().getCity(),应通过委托方法封装并处理空值。

详解java中的迪米特法则 (lod)_最少知道原则在类设计中的体现

LoD 不是“少写代码”,而是“少暴露依赖”

迪米特法则(LoD)常被误解为“类里调用的方法越少越好”,其实核心是:一个类应该只和**直接朋友**通信,不通过中间对象链式访问下游属性或方法。比如 order.getCustomer().getAddress().getCity() 就违反了 LoD —— order 和 city 不是朋友,中间穿过了 getCustomer() 和 getAddress() 两层。

这么做的原因很实际:一旦 Customer 类重构,把 getAddress() 改成 fetchContactInfo(),或者 Address 类移除了 getCity(),所有链式调用的地方全挂——错误信息可能是 NullPointerException 或 NoSuchMethodError,但根因藏得深,排查成本高。

  • 真正的朋友只有三类:this、方法参数、方法内 new 出来的对象(不含构造器注入的依赖)
  • Spring 管理的 Bean(如 @Autowired 注入的 service)不算“直接朋友”,不能在业务逻辑里链式调它返回值的子方法
  • DTO/VO 层可以适度放宽(毕竟只是数据载体),但领域模型、Service、Repository 层必须严格守界

怎么改?用“委托方法”代替“穿透访问”

面对 order.getCustomer().getAddress().getCity() 这种写法,别急着加工具类或静态方法,优先在 Order 类里加一个委托方法:

public String getCustomerCity() {
    return customer != null && customer.getAddress() != null 
        ? customer.getAddress().getCity() 
        : null;
}

这样调用方只需写 order.getCustomerCity(),既清晰又可控。如果后续地址逻辑变复杂(比如要支持国际格式、缓存城市名),改的只是 Order 自己的方法,不影响上游。

Java 接口排错助手
Java 接口排错助手

在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。

下载

立即学习“Java免费学习笔记(深入)”;

  • 委托方法里要处理空指针,别把 NullPointerException 推给调用方
  • 不要为了“符合 LoD”而在 Order 里复制 Address 的全部行为,只暴露必要语义(如 getCustomerCity()),不是 getCustomerAddressStreet() + getCustomerAddressZip() + …
  • 如果多个类都要取客户城市,说明这个逻辑可能该上提到 CustomerService,由它统一提供 findCityByOrderId(Long id) —— 此时 Order 反而不该有 getCustomerCity()

Builder 模式和 Fluent API 是 LoD 的常见陷阱

用 new UserBuilder().name("a").email("b").address(new AddressBuilder().city("c").build()).build() 看似链式优雅,但实际让 UserBuilder 强依赖了 AddressBuilder 的内部结构。一旦 AddressBuilder 增加校验逻辑、改构造方式,所有用到它的 builder 都得跟着动。

  • Builder 类之间应解耦:让 UserBuilder.address(Address address) 接收成品对象,而不是暴露其构建过程
  • Fluent API 的每个 .xxx() 方法应返回 this,且不引入新类型依赖;返回 AddressBuilder 就打破了封装边界
  • Lombok 的 @Builder 默认安全,因为它不生成跨类型的链式跳转;但自定义 builder 时极易踩坑

IDE 能帮你看出来,但不会替你设计

IntelliJ 可以用 Inspection 检出“chained method calls”,Eclipse 也有类似规则,但它们只能标出 a.getB().getC().doX() 这种明显链式,识别不了语义等价的“隐式穿透”,比如:

public class OrderService {
    public void process(Order order) {
        Customer c = customerRepo.findById(order.getCustomerId());
        String city = c.getAddress().getCity(); // 这里又穿透了
    }
}

这种写法 IDE 很难告警,但它一样违反 LoD —— OrderService 本不该知道 Customer 内部怎么存地址。

  • 真正的难点不在语法层面,而在职责划分:谁该负责解释“订单的客户城市”这个业务概念?是 Order 自己?CustomerService?还是单独的 LocationQueryService?
  • 团队里最容易忽略的是测试友好性:违反 LoD 的代码,mock 起来特别费劲,往往要 mock 三层对象才能跑通一个单元测试
  • LoD 不是银弹,过度遵守会导致大量薄薄的委托方法,反而模糊主干逻辑——关键看那个“穿透点”是否稳定、是否属于当前类的合理责任范围

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2851

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

517

2026.01.26

eclipse教程
eclipse教程

php中文网为大家带来eclipse教程合集,eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。php中文网还为大家带来eclipse的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

710

2023.06.14

eclipse怎么设置中文
eclipse怎么设置中文

eclipse设置中文的方法:除了设置界面为中文外,你还可以为Eclipse添加中文插件,以便更好地支持中文编程。例如,你可以安装EBNF插件来支持中文变量名,或安装Chinese Helper来提供中文帮助文档。本专题为大家提供eclipse设置中文相关的各种文章、以及下载和课程。

6046

2023.07.24

c语言编程软件有哪些
c语言编程软件有哪些

c语言编程软件有GCC、Clang、Microsoft Visual Studio、Eclipse、NetBeans、Dev-C++、Code::Blocks、KDevelop、Sublime Text和Atom。更多关于c语言编程软件的问题详情请看本专题的文章。php中文网欢迎大家前来学习。

9419

2023.11.02

Eclipse版本号有哪些区别
Eclipse版本号有哪些区别

区别:1、Eclipse 3.x系列:Eclipse的早期版本,包括3.0、3.1、3.2等;2、Eclipse 4.x系列:Eclipse的最新版本,包括4.0、4.1、4.2等;3、Eclipse IDE for Java Developers等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2804

2024.02.23

eclipse和idea有什么区别
eclipse和idea有什么区别

eclipse和idea的区别:1、平台支持;2、内存占用;3、插件系统;4、智能代码提示;5、界面设计;6、调试功能;7、学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

662

2024.02.23

eclipse设置中文全教程
eclipse设置中文全教程

本专题整合了eclipse设置中文相关教程,阅读专题下面的文章了解更多详细操作。

3906

2025.10.10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn