Effective Java笔记(5)优先考虑依赖注入来引用资源

Effective JAVA 笔记 快速回想一下effective java 阅读详情

        有许多类会依赖一个或多个底层的资源 。 例如,拼写检查器需要依赖词典 。 因此,像下面这样把类实现为静态工具类的做法并不少见(详见第 4 条):

// Inappropriate use of static utility - inflexible & untestable!
public class SpellChecker {
    private static final Lexicon dictionary = ...;
    private SpellChecker() {} // Noninstantiable
    public static boolean isValid(String word) { ... }
    public static List<String> suggestions(String typo) { ... }
}

        同样地,将这些类实现为 Singleton 的做法也并不少见(详见第 3 条) :

// Inappropriate use of singleton - inflexible & untestable!
public class SpellChecker {
    private final Lexicon dictionary = ...;
    private SpellChecker(...) {}
    public static INSTANCE = new SpellChecker(...);
    public boolean isValid(String word) { ... }
    public List<String> suggestions(String typo) { ... }
}

        以上两种方法都不理想,因为它们都是假定只有一本词典可用 。 实际上,每一种语言都有自己的词典,特殊同汇还要使用特殊的词典 。 此外,可能还需要用特殊的词典进行测试 。 因此假定用一本词典,就能满足所有需求,这简直是痴心妄想 。

        建议尝试用 SpellChecker 来支持多词典,即在现有的拼写检查器中,设 dictionary域为 nonfinal ,并添加一个方法用它来修改词典,但是这样的设置会显得很笨拙、容易出错,并且无法并行工作 。 静态工具类和 Singleton 类不适合于需要引用底层资源的类 。

        这里需要的是能够支持类的多个实例(在本例中是指 SpellChecker ),每一个实例都使用客户端指定的资源(在本例中是指词典) 。 满足该需求的最简单的模式是, 当创建一个新的实例时 , 就将该资源传到构造器中 。 这是依赖注入( dependency injection )的一种形式:词典(dictionary )是拼写检查器的一个依赖( depend ency ),在创建拼写检查器时就将词典注入( injected )其中 。

// Dependency injection provides flexibility and testability
public class SpellChecker {
    private final Lexicon dictionary;
    public SpellChecker(Lexicon dictionary) {
        this.dictionary = objects.requireNonNull(dictionary);
    }
    public boolean isValid(String word) { ... }
    public List<String> suggestions(String typo) { ... }
}

        依赖注入模式就是这么简单,因此许多程序员使用多年,却不知道它还有名字呢 。 虽然这个拼写检查器的范例中只有一个资源(词典),但是依赖注入却适用于任意数量的资源,以及任意的依赖形式 。 依赖注入的对象资源具有不可变性,因此多个客户端可以共享依赖对象(假设客户端们想要的是同一个底层资惊)。依赖注入也同样适用于构造器、静态工厂和构建器 。

        这个程序模式的另一种有用的变体是,将资源工厂( factory )传给构造器 。 工厂是可以被重复调用来创建类型实例的一个对象 。 这类工厂具体表现为工厂方法( Factory Method) 。 在 Java 8 中增加的接口 SupplierT>,最适合用于表示工厂 。带有 Supplier<T>的方法,通常应该限制输入工厂的类型参数使用有限制的通配符类型( bounded wildcard type ),以便客户端能自多传入一个工厂,来创建指定类型的任意子类型 。 例如,下面是一个生产马赛克的方法,它利用客户端提供的工厂来生产每一片马赛克 :

Mosaic create(Supplier<? extends Tile> tileFactory) { ... }

        虽然依赖注入极大地提升了灵活性和可测试性,但它会导致大型项目凌乱不堪,因为它通常包含上千个依赖 。 不过这种凌乱用一个依赖、注入框架( dep endency injection framework )便可以终结,如 Dagger 、Guice或者 Spring。 

        总而言之,不要用 Singleton 和静态工具类来实现依赖一个或多个底层资源的类,且该资源的行为会影响到该类的行为;也不要直接用这个类来创建这些资源 。 而应该将这些资源或者工厂传给构造器(或者静态工厂,或者构建器),通过它们来创建类 。 这个实践就被称作依赖注入,它极大地提升了类的灵活性 、 可重用性和可测试性 。

ESP32-CAM图传小车:端边协同的嵌入式视觉系统设计 在物联网边缘智能场景中,嵌入式视觉系统需平衡实时性、算力与成本。其核心在于理解图像采集、硬件编码、低延迟传输与分层计算的基本原理——OV2640等CMOS传感器配合JPEG硬件编码可显著降低主控负载;TCP流式协议比HTTP/RTSP更适配资源受限MCU;而‘计算卸载’架构将OpenCV等重负载移至Android端,使ESP32专注实时控制与传输,既发挥FreeRTOS任务调度优势,又规避了PSRAM带宽与内存瓶颈。该模式广泛适用于教育机器人、智能巡检及DIY视觉终端等场景,本文以WiFi图传坦克小车为载体 阅读详情

相关推荐

滚动时域优化方法

滚动时域优化(Receding Horizon Optimization, RHO),也被广泛称为模型预测控制(Model Predictive Control, MPC),是一种用于动态系统优化和控制的。其核心思想是“在每个当前时刻k,控制器只考虑未来一个(称为“预测时域”或“优化时域”,长度N)内的系统行为。(通过测量或估计得到)。(描述状态如何随输入和干扰变化)。(如果有,可能基于历史数据或假设)。在这个有限的未来时域[k, k+N-1]上,求解一个。这个优化问题的目标是找到一个。

m0_69522810的博客 2297

《Effective Java》学习笔记 - (5) 优先考虑依赖注入来引用资源

依赖注入在这里的含义就是把一个类当作参数传入到另一个类中。在这一节提到,如果是想要在一个类中使用另一个类的资源,那么最好就是使用依赖注入。

Jwasx的博客 406

统信UOS系统网络服务异常排查:WIFI图标消失与网络设置缺失的解决方案

本文详细解析了统信UOS系统WIFI图标消失与网络设置缺失的常见问题,提供了从基础修复到进阶排查的完整解决方案。重点分析了NetworkManager服务异常的根本原因,包括系统更新中断、权限配置错误等,并给出实用的命令行操作指南和预防措施,帮助用户快速恢复网络功能。

weixin_29234239的博客 619

解读 Java 经典巨著《Effective Java》90条编程法则,第5条:优先考虑依赖注入来引用资源

Joshua Bloch 在《Effective Java》中提出的第5条编程法则“优先考虑依赖注入来引用资源”着重强调了依赖注入(DI)的重要性,该法则主要关注如何有效地管理类和资源之间的依赖关系。

赵士杰——成功并非一蹴而就,而是在持之以恒的努力中逐渐实现。 1631

《探秘 BME680温度湿度气压气体传感器模块:环境感知的卓越之选》:此文为AI自动生成

BME680 是一款由博世公司推出的集成环境传感器模块,在环境监测和物联网等领域中发挥着重要作用。它能够同时测量温度、湿度、气压和气体浓度等多个环境参数,为各种应用提供准确可靠的环境数据。该模块采用小巧的封装形式,便于集成到各种设备中,无论是智能家居、可穿戴设备还是工业监测系统,都能轻松适配。例如,在智能家居系统中,BME680 模块可以监测室内环境参数,如温度、湿度、气压和空气质量等。通过与智能家居控制器或智能手机应用程序的连接,用户可以实时了解室内环境状况,并根据需要进行调整。

zheng_ruiguo的专栏 1868

FPGA时钟设计陷阱:为什么你的MRCC引脚总触发Place 30-675错误?

本文深入解析FPGA开发中常见的Place 30-675错误,揭示MRCC引脚与时钟资源分配的关键问题。通过对比MRCC与普通IO引脚特性,分析错误根源,并提供时钟约束优化、IP核重配置和手动布局三套解决方案,帮助工程师规避时钟设计陷阱,提升FPGA系统稳定性。

potato的博客 693

《Effective Java》第5条:优先考虑依赖注入来引用资源

带有 Supplier的方法,通常应该限制输入工厂的类型参数使用有限制的通配符类型(即不要使用Object这种类型,这种没有限制),详见第31条,以便客户端能够传入一个工厂,来创建指定类型的任意子类型。原文P17:满足该需求的最简单的模式是:当创建一个新的实例时,就将该资源传到构造器中。这是依赖注入(dependencyinjection)的一种形式:词典(dictionary)是拼写检查器的一个依赖(dependency),在创建拼写检查器时就将词典注入(injected)其中。(Spring用的最多)

TD_FAlmK的博客 847

【HOJ系列】HOJ判题机部署

【HOJ系列】HOJ判题机部署

随风浪仔的专栏 904

《Effective Java》第五条:优先考虑依赖注入来引用资源

《Effective Java》第五条的核心思想是:类不应自行创建其依赖的资源(如数据库连接、网络服务、配置信息等),而应通过外部传入(即 “依赖注入”)的方式获取,以提高灵活性、可测试性和复用性。 很多类在实现时会 “硬编码” 依赖资源,例如在类内部直接创建数据库连接、实例化特定服务等。这种做法存在三个严重问题:硬编码的本质是 **“类自己创建依赖”,而测试需要的是“替换依赖为测试替身(如 Mock 对象)”**,这两者是矛盾的。假设我们有一个发送短信的服务类,硬编码了具体的短信网关实现: 如果我们

papilon_的博客 789

windows下使用Nginx搭建Rtmp流媒体服务器,实现视频直播功能

一、环境介绍 操作系统:win10 64位系统 Linux下搭建Nginx搭建Rtmp流媒体服务器方法请看这里:https://blog.csdn.net/xiaolong1126626497/article/details/105378894 二、流媒体服务器介绍 流媒体服务器的主要功能是以流式协议(RTP/RTSP、MMS、RTMP等)将视频文件传输到客户端,供用户在线观看;也可从视频采集、压缩软件接收实时视频流,再以流式协议直播给客户端。 nginx服务器是开源的高性能的http服务器,反向

1万+

华为OD机试真题 新系统 2026-04-22 Python&JS 实现【小学生班长选举增强版】

9 月份开学第一天,小学某班级进行班长选举活动,班级共有 N 个学生,每个学生最多可投 3 票(对同一个人只能投一票),也可以弃权不投票,大家投票时写上对应学生的名字。 假设学生不存在重名。考虑到部分少数民族名字带分隔,且整体较长,同学在投票时为了方便,允许同学写全称,也可以只写其中的部分连续段。 例如班级里只有 2 个少数民族名称带点的同学:

MISAYAONE的博客 317

《Effective Java》解读第5条:优先考虑依赖注入来引用资源

摘要:本文探讨了依赖注入(DI)在Java开发中的重要性。通过对比静态工具类和单例模式,指出它们依赖硬编码、缺乏灵活性的缺陷。推荐使用依赖注入模式,通过构造函数或setter方法从外部注入依赖,从而提高代码的灵活性、可测试性和松耦合性。文章详细介绍了Spring Boot中三种依赖注入方式(构造器注入、setter注入和字段注入)及其优缺点,建议在大型项目中使用DI框架(如Spring)管理复杂依赖关系。依赖注入是现代Java开发中实现高质量代码的关键实践。

Cosmoshhhyyy的博客 628

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Effective Java -- 引用资源时优先依赖注入

此系列文章为本人对《Effective Java》一书的学习笔记,主要是记录对书中重点内容的理解。既然有缘看到此文,那么希望能对你有所帮助。本文对应原书 第5条 优先考虑依赖注入来引入资源

心之所往 码之所向 321

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Effective Java3.5-优先考虑依赖注入来引用资源

5 优先考虑依赖注入来引用资源 主要内容:讲述在使用静态工具类,Singleton类时,最好不要依赖于其他的底层资源类,意味着静态工具类和Singleton最好是独立的类,即使需要用到其他的参数,也最好不要引用其他对象,更不要是一个类的同种变形(比如它的子类们或者组合类) 主要目标:使用静态工具类,Singleton类时不引用特定的(底层)资源。创建实例时就将资源(另一个对象)传到构造器。使用Supplier来控制资源(另一个对象)的类型(上界)。使用资源工厂来获得资源,并将工厂作为“另一个对象”作为传到

JunxuanBo 329

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Effective Java笔记:优先考虑依赖注入来引用资源

子类,或者需要延迟构造(Lazy Initialization),传统构造方法难以高效实现。如果想动态决定实例化逻辑(如:参数配置、动态初始化),则需要大量冗余代码。在传统的工厂设计模式中,创建一个 Mosaic 通常会直接传入一个具体的。的实例(可能是某个具体子类的实例,而非Tile本身)。这个方法是一个静态工厂方法,用于创建一个。是标准函数式接口,极其方便配合。等 Java 8+ 的特性使用。是由这些方块拼接起来的大图片。实例,可以根据需求动态提供。的实现只需要知道如何生成。如果需要按需生成不同的。

eclipseC的博客 297

Effective Java学习笔记--优先考虑依赖注入来引用资源

Java的类往往不是独立的,而是依赖一个或者多个底层的资源来构建的。就比如一个蛋糕,必须要依靠一个模子才能做出想要的形状。这里,作者举了一个拼写检查器的例子,一个拼写检查器必须要依赖一本或多本词典才能去做校验。

weixin_50353846的博客 477

Effective Java -- 创建和销毁对象 -- 优先考虑依赖注入来引用资源

第二章 创建和销毁对象 第五条 优先考虑依赖注入来引用资源 不要用静态工具类或Singleton来实现依赖。 应该使用依赖注入,将这些资源或工厂传给构造方法,提高类的灵活性、可重用性和可测试性。

weixin_43164759的博客 401

笔记《Effective Java》01: 创建和销毁对象

《Effective Java》这本书可以说是程序员必读的书籍之一。这本书讲述了一些优雅的,高效的编程技巧。对一些方法或API的调用有独到的见解,还是值得一看的。刚好最近重拾这本书,看的是第三版,顺手整理了一下笔记,用于自己归纳总结使用。建议多读一下原文。今天整理第一章节:创建和销毁对象。

有一只柴犬的专栏 1852

深入理解《Effective Java》 之 条目5:优先考虑通过依赖注入来连接资源

指的是一个类做的事情(行为),不是固定的,而是。

墨问的专栏 359

05.依赖注入优先于硬连接资源

前言 《Effective Java》中文第三版,是一本关于Java基础的书,这本书不止一次有人推荐我看。其中包括我很喜欢的博客园博主五月的仓颉,他曾在自己的博文《给Java程序猿们推荐一些值得一看的好书》中也推荐过。加深自己的记忆,同时向优秀的人看齐,决定在看完每一章之后,都写一篇随笔。如果有写的不对的地方、表述的不清楚的地方、或者其他建议,希望您能够留言指正,谢谢。 《Effective Ja...

龚国玮的博客 1166

Effective Java读书笔记

第一章 引言 本文用来记录Effective Java学习过程中的各个知识点,受此时能力所限,有些点可能讲的不太清楚,或者理解有错误的地方,请多多指教! 第二章 创建和销毁对象 第一条 用静态工厂方法代替构造器 可参考文章:https://blog.csdn.net/u014129886/article/details/89670049 总而言之,静态工厂方法和共有构造器各有各的用处,我们需要理解他们各自的长处,静态工厂经常更加合适。 此处的静态工厂方法与设计模式中的工厂模式不同,这里是一种构造

逆水行舟,不进则退 1441

小鸡爪读Effective Java记录4:优先考虑依赖注入来引用资源

小鸡爪学习Effective java,简简单单例子理解依赖注入,小鸡爪觉得这更多的是思维方式的转化,对我们帮助很大。

weixin_44339617的博客 455

Effective Java(3版)第二章 第五条 优先考虑依赖注入来引用资源详解

文章摘要: 本文详细介绍了依赖注入设计模式及其实现方式。依赖注入的核心思想是将依赖对象的创建与使用分离,通过控制反转由外部提供依赖对象。文章对比了传统非DI方式与依赖注入的区别,并阐述了三种依赖注入实现方式:基本依赖注入、工厂方法注入(使用Java8的Supplier接口)以及Spring框架注入。特别分析了工厂方法注入的优势,包括延迟创建、复杂创建逻辑处理等。最后总结了依赖注入的最佳实践,强调避免内部创建依赖、合理选择注入方式等原则。全文通过代码示例展示了各种注入方式的具体实现,为设计松耦合、可测试的系统

qq_47129343的博客 387

优先考虑依赖注人来引用资源

优先考虑依赖注人来引用资源 有许多类需要依赖底层资源,比如我们有个类需要依赖底层的字典资源,像下面这样做成静态域的,或者把类做成Singleton的都是很常见的。 public class Word { private static final Dictionary DICTIONARY = new Dictionary(); } 但是这只是作为有一本字典的情况下,当我们在不同的情况下需...

weixin_44130081的博客 1248

Effective Java 【创建和销毁对象篇】 第5条 优先考虑依赖注入来引入资源

优先考虑依赖注入来引入资源 有许多类会依赖一个或者多个底层的资源,例如:拼写检查器需要依赖词典。因此,像下面这种把类实现为静态工具类的做法很常见。 public class SpellChecker{ private static final Lexicon dictionary = ...; private SpellChecker(){ } public static boolean isValid(String word){ } public static L

zhangxiaoxiao9527的博客 285
上一篇: Effective Java笔记(3)用私有构造器或者枚举类型强化 Singleton 属性
下一篇: Effective Java笔记(6)避免创建不必要的对象
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值