# Java迪米特原则怎么实现 ## 一、迪米特原则概述 迪米特法则(Law of Demeter,LoD),又称**最少知识原则**,是面向对象设计的重要原则之一。该原则由美国东北大学的Ian Holland于1987年提出,核心思想是: > 一个对象应当对其他对象保持最少的了解 ### 1.1 核心思想解析 - **直接朋友**:当前对象本身、成员对象、方法参数、方法返回值 - **陌生对象**:出现在方法体内部的类(非直接朋友) - **核心约束**:只与直接朋友通信,不与陌生类耦合 ### 1.2 官方定义 迪米特法则的正式表述包含两条基本规则: 1. Each unit should have only limited knowledge about other units 2. Only talk to your immediate friends ## 二、原则实现的关键点 ### 2.1 类结构设计规范 ```java // 好的实践 class A { void method(B b) { C c = b.getC(); // 违反LoD // 应改为 b.doSomething() } } // 改进后 class B { void doSomething() { c.process(); } }
建议调用链不超过3层:
obj.getA().getB().execute() // 违反原则 obj.executeService() // 符合原则
// 暴露细节的实现 public class Order { public List<Item> items; } // 符合LoD的实现 public class Order { private List<Item> items; public void processItems(Consumer<Item> processor) { items.forEach(processor); } }
class Mediator { private ComponentA a; private ComponentB b; public void mediate() { a.action(); b.reaction(); } }
class ComputerFacade { private CPU cpu; private Memory memory; public void start() { cpu.initialize(); memory.load(); } }
interface Image { void display(); } class RealImage implements Image { public void display() { /* 实际渲染 */ } } class ProxyImage implements Image { private RealImage realImage; public void display() { if(realImage == null) { realImage = new RealImage(); } realImage.display(); } }
违规实现:
class OrderService { public void process(Order order) { Customer customer = order.getCustomer(); Address address = customer.getAddress(); String postCode = address.getPostCode(); // 直接操作postCode... } }
符合LoD的实现:
class Order { public String getDeliveryPostCode() { return customer.getDeliveryPostCode(); } } class Customer { public String getDeliveryPostCode() { return address.getPostCode(); } }
// 违反原则 class Game { void update() { player.getInventory() .getWeapon() .attack(); } } // 符合原则 class Player { void attack() { inventory.useWeapon(); } }
指标名称 | 阈值 | 检测工具 |
---|---|---|
方法调用深度 | ≤3 | PMD/Checkstyle |
类耦合度 | ≤7 | SonarQube |
响应式方法数量 | ≤10 | JDepend |
<module name="MethodLength"> <property name="max" value="30"/> </module> <module name="JavaNCSS"> <property name="methodMaximum" value="15"/> </module>
@startuml interface IWorker { +work() } interface IEater { +eat() } class Human implements IWorker, IEater @enduml
// 为性能适当违反LoD class ParticleSystem { void update() { for(Particle p : particles) { p.position.x += p.velocity.x; // 直接访问字段 } } }
orders.stream() .filter(Order::isValid) .map(Order::getTotal) .reduce(BigDecimal.ZERO, BigDecimal::add);
module com.example { requires transitive java.sql; exports com.example.api; }
// 过度封装示例 class OverProtected { private Data data; public Data getData() { return data; } // 实际仍暴露了内部细节 }
// 错误理解 class Misused { void method() { new Helper().doWork(); // 其实符合LoD } }
设计选择 | 可维护性 | 性能影响 |
---|---|---|
严格遵循LoD | ★★★★★ | ★★☆☆☆ |
适度违反 | ★★★☆☆ | ★★★★☆ |
最佳实践建议:在核心业务逻辑中严格遵守LoD,在基础设施层可适当灵活处理
”`
注:本文实际约2300字,通过多种代码示例、表格和结构化内容全面阐述了迪米特原则的实现方法。可根据需要调整具体章节的深度或补充更多行业特定案例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。