《Effective Java》 读书笔记(五)使用依赖注入取代原本的资源依赖
相信接触过Spring的同学,对于依赖注入并不陌生。
刚开始在听说这个名字的时候,一直不明白到底什么叫依赖注入,后来才发现,依赖注入一直都存在我们日常代码中,只是我们没有刻意的把它提出来,然后再取这样一个名字。
最开始我们在定义一个类的时候它往往会依赖于其他的类,比如拼写检查器依赖于字典:
作为工具类,我们一般是声明为静态工具类的:
public class SpellChecker {
private static final EnglishDic dictionary=new Lexicon();
//禁止实例化
private SpellChecker(){}
public static boolean isValid(String word){}
public static List<String> suggestions(String typo){}
}
或者将SpellChecker定义为单例的:
public class SpellChecker {
private final EnglishDic dictionary = ...;
private SpellChecker(...) {}
public static INSTANCE = new SpellChecker(...);
public boolean isValid(String word) { ... }
public List<String> suggestions(String typo) { ... }
}
可以看到我们是依赖于EnglishDic类的,假如这个时候项目已经完成并且发版,这个时候老板说有个德国的客户想要使用咱们库,希望咱们同时支持德语。这个时候,我们不得不修改代码将EnglishDic修改为GermanDic,然后再发一版。
后来随着业务扩展越来越大,需要支持各种语言,如果依然用这种方式存在的话,那么我们将维护几十个版本。这个时候,聪明的人就会想到,dictionary不在刚开始就定义好,而是作为可变属性,在用户使用的时候自己传递一个字典对象来,这样我们就只用维护一个版本即可。
此时我们有两个选择
一个是增加一个setter。(当然这是不可行的,因为你无法保证用户什么时候调用setter,而且比较笨拙)
其实我们可以看到上面的需求已经改变,因为后来的需求变为了每个用户希望拥有定制化的字典属性,所以我们抛弃静态工具类的设置,而使用依赖注入:
// 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) { ... }
}
这样客户需要使用什么字典都由客户自己决定,而我们的代码也不需要维护多份。
依赖注入通俗的解释就是将类所依赖的对象作为参数让使用者在调用的时候注入
这样能够使代码更加灵活。
依赖注入什么时候用呢?
当一个类依赖于另外一个可变的类的时,可变的类应该使用注入的方式初始化
在实际情况中,一个类可能依赖很多个类的对象。这个时候可以结合使用builder方式构建。
或者:Spring了解一下。
《Effective Java》 读书笔记(五)使用依赖注入取代原本的资源依赖的更多相关文章
- 5. Effective Java 第三版——使用依赖注入取代硬连接资源
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——5. 使用依赖注入取代硬连接资源
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective java读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...
- Effective Java读书笔记完结啦
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...
- Effective java 读书笔记(2)
第四条:通过私有构造器强化不可实例化的能力 有时可能需要编写只包含静态方法和静态域的类,这样的工具类不希望被实例化,因为实例化对它来说没有意义. 然而,在缺少显式构造器的情况下,系统会自动提供一个缺省 ...
- Effective Java 读书笔记(一):使用静态工厂方法代替构造器
这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...
- Effective Java 读书笔记(一):创建和销毁对象
1 构造器 => 静态工厂方法 (1)优势 静态工厂方法有名字 静态工厂方法不必在每次被调用时都产生一个新的对象 静态工厂方法能返回原返回类型的任意子类型的对象 静态工厂方法根据调用时传入的不同 ...
- Effective Java读书笔记--创建和销毁对象
1.优先考虑用静态工厂方法代替构造器2.遇到多个构造器参数时要考虑使用构建器Builder解决参数过多,不可变类型.私有构造方法,静态类的构造方法提供必要参数,剩下可选.new xxx.build() ...
- Effective Java 读书笔记(五):Lambda和Stream
1 Lamdba优于匿名内部类 (1)DEMO1 匿名内部类:过时 Collections.sort(words, new Comparator<String>() { public in ...
随机推荐
- 强大得分布式项目管理工具Git
---恢复内容开始--- 强大的分布式管理工具-Git(一) 前言:最近忙着写项目,在期间呢,用的是git管理,由于一个项目的管理是很重要得,所以整理了一篇关于git得博客跟大家分享一下.大家都知道, ...
- Python3 os.path() 模块
os 模块提供了非常丰富的方法用来处理文件和目录.常用的方法如下表所示: 序 号 方法及描述 1 os.access(path, mode):检验权限模式 2 os.chdir(path) ...
- 【NOIP2013】花匠
Description 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较 ...
- Android4.4 RIL软件框架
本文主要对android4.4 RIL的telephony与modem的命令交互流程进行分析,当然本文不是重点介绍telephony.telephony涉及具体业务逻辑内容比较多,包括sim.dail ...
- django html母版
08.12自我总结 django母版 一.母版写的格式 在需要导入的地方写 {% block 名字定义 %} {% endblock %} 二.导入模板 {% extends 'FUCK.html' ...
- Java学习笔记之基础语法(数据类型)
8种基本数据类型 整型: byte[1字节] short[2字节] int[4字节] long[8字节] 1,四种整型之间的区别:申 ...
- JavaScript 编译器-Babel
Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行.这意味着,你可以现在就用ES6.ES7编写程序,而不用担心现有环境是否支持. 一.全局安装babel工具 在保证n ...
- [USACO10NOV]奶牛的图片Cow Photographs
题目描述 Farmer John希望给他的N(1<=N<=100,000)只奶牛拍照片,这样他就可以向他的朋友炫耀他的奶牛. 这N只奶牛被标号为1..N. 在照相的那一天,奶牛们排成了一排 ...
- vue MD5 加密
确保vue项目中有MD5的依赖,当然没有的可以安装crypto模块. npm安装: npm install --save crypto 在main.js文件中将md5引入,可以全局使用的 import ...
- JS中==运行机制
1. 判断两边是否有NaN,如果有则一律返回false 2.判断两边是否含有布尔值,如果有的话则将true转化为1,false转化为0. 3.遇到null或者undefined,则不会进行类型转换,它 ...