温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java迪米特原则怎么实现

发布时间:2022-01-14 11:04:21 来源:亿速云 阅读:170 作者:iii 栏目:大数据
# 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(); } } 

2.2 方法调用深度控制

建议调用链不超过3层:

obj.getA().getB().execute() // 违反原则 obj.executeService() // 符合原则 

2.3 信息隐藏技巧

// 暴露细节的实现 public class Order { public List<Item> items; } // 符合LoD的实现 public class Order { private List<Item> items; public void processItems(Consumer<Item> processor) { items.forEach(processor); } } 

三、典型实现模式

3.1 中介者模式应用

class Mediator { private ComponentA a; private ComponentB b; public void mediate() { a.action(); b.reaction(); } } 

3.2 外观模式实现

class ComputerFacade { private CPU cpu; private Memory memory; public void start() { cpu.initialize(); memory.load(); } } 

3.3 代理模式示例

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(); } } 

四、实际案例解析

4.1 电商系统设计

违规实现:

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(); } } 

4.2 游戏开发示例

// 违反原则 class Game { void update() { player.getInventory() .getWeapon() .attack(); } } // 符合原则 class Player { void attack() { inventory.useWeapon(); } } 

五、代码度量与检测

5.1 检测指标

指标名称 阈值 检测工具
方法调用深度 ≤3 PMD/Checkstyle
类耦合度 ≤7 SonarQube
响应式方法数量 ≤10 JDepend

5.2 Checkstyle配置示例

<module name="MethodLength"> <property name="max" value="30"/> </module> <module name="JavaNCSS"> <property name="methodMaximum" value="15"/> </module> 

六、与其它原则的关系

6.1 与单一职责原则

  • 协同点:都强调功能的集中性
  • 差异点:SRP关注类内聚,LoD关注类间耦合

6.2 与接口隔离原则

@startuml interface IWorker { +work() } interface IEater { +eat() } class Human implements IWorker, IEater @enduml 

七、实践中的平衡策略

7.1 合理违反的场景

  1. 工具类方法(如StringUtils)
  2. Builder模式链式调用
  3. 流畅接口设计

7.2 性能权衡案例

// 为性能适当违反LoD class ParticleSystem { void update() { for(Particle p : particles) { p.position.x += p.velocity.x; // 直接访问字段 } } } 

八、现代Java中的演进

8.1 Stream API的LoD实践

orders.stream() .filter(Order::isValid) .map(Order::getTotal) .reduce(BigDecimal.ZERO, BigDecimal::add); 

8.2 模块化系统的体现

module com.example { requires transitive java.sql; exports com.example.api; } 

九、常见误区辨析

9.1 过度封装问题

// 过度封装示例 class OverProtected { private Data data; public Data getData() { return data; } // 实际仍暴露了内部细节 } 

9.2 误用案例对比

// 错误理解 class Misused { void method() { new Helper().doWork(); // 其实符合LoD } } 

十、总结与最佳实践

10.1 实施checklist

  • [ ] 检查方法参数是否超过3个
  • [ ] 验证方法调用链深度
  • [ ] 审核类依赖关系数量
  • [ ] 确保DTO只包含简单类型

10.2 性能与维护平衡表

设计选择 可维护性 性能影响
严格遵循LoD ★★★★★ ★★☆☆☆
适度违反 ★★★☆☆ ★★★★☆

最佳实践建议:在核心业务逻辑中严格遵守LoD,在基础设施层可适当灵活处理

参考资料

  1. 《Clean Code》- Robert C. Martin
  2. 《Effective Java》- Joshua Bloch
  3. JDK 17源码设计规范
  4. Google Java Style Guide

”`

注:本文实际约2300字,通过多种代码示例、表格和结构化内容全面阐述了迪米特原则的实现方法。可根据需要调整具体章节的深度或补充更多行业特定案例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI