Getter DI是个好主意吗?

有时,您可能会听说通过getter方法完成的依赖项注入,该方法会覆盖子类或伪造测试框架。 它允许类具有一组设置的依赖关系,该依赖关系实际上是经过硬编码的,但是可以根据需要“注入”。

从现在开始, 我已经写过关于所谓的“公司编码”依赖项的想法 。 不过,我在那篇文章中没有提到吸气剂注入,因为当时我还不太了解,现在我认为这并不是一个好主意。 我对第一个想出这种回旋方式做DI的人表示敬意,但这并不意味着我喜欢它。 我已经做了一些练习来弄出round回的做事方式,但这并不意味着我没有意识到这是一个坏主意。

我不能说我的观点应该是关于吸气剂注入是否不良以及永远不应该被触及的最终裁决。 我只想说说我对此有什么反对,并讨论更好的选择。

什么是吸气剂注入?

吸气剂注入是指您使用吸气剂方法进行硬编码的“依赖注入”。 我使用引号是因为,因为它是硬编码的,所以它不是真正的依赖注入。 “注入”依赖项的方式是通过子类化和覆盖getter方法或通过使用反射(通常是使用模拟库)替换它来更改getter。 我将举一个继承的例子。

public class ClassUnderTest
{public void saySomething(){System.out.println(getString());}protected String getString(){return "Hello World";}
}public class GetFrench extends ClassUnderTest
{@Override protected String getString(){return "Bonjour le monde";}
}

为什么吸气剂注射不好?

我有什么反对吸气剂注入的方法? 简而言之,我不喜欢它的最大原因是因为您的操作方式。 必须对要测试的内容进行子类化或模拟并不是一个好主意,因为这样做可以使您不再测试相同的类。 您正在测试其他内容。

我不喜欢的另一个原因是因为人们可能很难理解。 测试代码必须易于读取和编写,并且使用getter注入会在测试代码中造成混淆。

我该如何解决?

上面的链接文章对如何进行“公司编码”依赖项进行了完整描述,但是我将在此处进行快速概述。

您需要做的第一件事是提供一种设置字段以保存依赖项的方法。 最好的方法是通过构造函数(如果您当前具有公共构造函数,则应使用程序包私有的构造函数重载),因为它有助于设计不可变的类。 第二种选择是提供使用该依赖项的方法的程序包私有重载,其中重载具有一个附加参数来获取依赖项。 这种技术也非常适合不可变的设计。 否则,您可以使用package-private字段或setter来设置依赖关系。

下一步是确定依赖项是普通对象还是工厂。 如果旧的getter每次都产生一个新对象, 并且需要 ,则该依赖关系应该是工厂。

如果您想要更深入的解释, 请查看我的旧文章 。

什么时候这不是一个坏主意?

尽管我对吸气剂注入不满意,但我对类似的东西也很满意:模板模式。 如果将getter抽象化,以便它的唯一实现是通过子类,则可以。

奥托罗

那是我对吸气剂注入的看法。 您可以不同意。 就我个人而言,我只是觉得这是依赖注入的最糟糕的选择(紧接着使用“自动装配” DI框架)。

翻译自: https://www.javacodegeeks.com/2015/06/is-getter-di-a-good-idea.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java数组根据下标插入数据

/** * * param arr1 源数组 * param n 下标 0...n * param value 值 * return */ public static String[] insertArray(String[] arr1,int n, String value){ //复制一个长度1的数组 String[] arr2 Arrays.copyO…

Javascript - 栈 和 单链表

最近在重温数据结构,于是写了一些代码玩玩,都是很初级的,表喷各位。。。。 function Stack() {this.dataStore [];this.top 0; }Stack.prototype {length: function () {return this.top;}, push: function (element) {this.dataStore[thi…

linux在文件或文件夹中查找字符串

命令:grep "字符串“ * -Rn 注:注意命令大小写,在当前文件夹下的所有文件中搜索字符串 命令:grep -rn ‘字符串’ xxx.log 注: 查询出字符串位置,xxx.log 为被搜索的文件 命令:more 1200 xxx.log 注…

sqlite数据库检索

1. 数据库检索, 得到某字段下所有值 1 - (NSArray *)selectWithColumName: (NSString *)columName2 tableName: (NSString *)tableName {3 if ([self openDatabase] YES) {4 5 NSString * selectSQL [NSString string…

处理中断

我只是在观看Heinz Kabutz的VJUG采访 ,这启发了我写一篇有关中断的文章。 顺便说一句,我建议您订阅VJUG YouTube频道 -确实非常有用。 Heinz始终是物有所值的,并且很难学到很多东西就很难看他的演讲。 他提出了有关如何处理InterruptedExcep…

word模板插入文本域并调整表格某一个行的列宽度

一、插入文本域 操作步骤:插入(菜单)->文档部件(菜单)->域(菜单)->邮件合并->输入名称->确认 二、调整word表格某个单元格宽度 选中某行,按住ctrl键的同时&#xf…

从拟物到简约 ------谈网站设计风格的变革

哪种设计才是好的设计?其实,每种设计都有其优势也会有其不足。关键在其应用场合,以及是否能够向用户传递有效的价值。武断地决定是否采用某种技术或者不思考其能否取悦用户的设计不是好设计。好的设计不应当局限于某种设计风格,而…

java遍历文件夹并获取所有路径

/** * 获取路径下的所有文件/文件夹 * param directoryPath 需要遍历的文件夹路径 * return */ public static List<String> getAllFile(String directoryPath) { LinkedList list new LinkedList(); if(directoryPathnull){ …

java中文件处理之图片_在Java 7中处理文件

java中文件处理之图片以下是The Well-Grounded Java Developer的草稿的修改后的片段。 它使您快速了解与以前版本相比&#xff0c;在Java 7中操作文件要容易得多。 通过使用新的Files类及其许多实用程序方法&#xff0c;您可以仅用一行代码就可以对文件执行以下操作&#xff1a…

java实时记录在线人数

1.配置过滤器 <listener> <listener-class>com.listener.SessionCount</listener-class > </listener> 2.登陆时记录 package com.insigma.common.listener; import java.util.HashMap; import java.util.HashSet; import java.util.Map.Entr…

检讨程序猿

程序员变程序猿&#xff0c;这是个中国问题。多年前&#xff0c;浦东某开发区一个年轻的编程员因病去世&#xff0c;他母亲从四川赴沪奔丧&#xff0c;清理遗物时&#xff0c;她发现儿子床垫下都是钱&#xff0c;老人家痛哭失声&#xff0c;她说&#xff0c;你们看呐&#xff0…

在Java 8中使用Rhino

Java将Nashorn作为JSR 223的新JavaScript实现&#xff08;javax.scripting&#xff09;。 尽管这无疑是个好消息&#xff08;通过直接生成Java代码&#xff0c;Nashorn比Rhino快得多&#xff09;&#xff0c;但它也带来了一些挑战&#xff1a; Nashorn与Rhino并非100&#xff…

java复制单个文件

/*org.apache.commons.io.FileUtils:java文件工具类*/ String targetPath"/xxx/targetfile.pdf";//已知文件全路径 String sourcePath/xxx/sourcefile.pdf";//复制文件全路径 File fnew File(targetPath); try { if(!f.exists()) { …

FTP服务器的搭建与安全配置

FTP可以说是Internet上使用非常广泛的一种通讯协议了。它工作在OSI模型的第7层&#xff0c;是TCP/IP的一种具体应用。FTP采用基于TCP的可靠连接&#xff1a;监听21端口来等待控制连接请求&#xff0c;当连接建立后&#xff0c;采用20号端口来建立数据传输通道。 FTP中使用的一些…

C#值类型以及默认值记录下

C#的值类型有bool,byte,sbyte,decimal,double,float,int,uint,long,string等 如果我们擅长使用默认值&#xff0c;可以帮助我们减少带来赋值及代码编写. 比如我我经常赋值&#xff1a; int i0;下面都是各个值类型的默认值&#xff1a; bool>false byte,sbyte>0 int,uint,…

java泛型视频教程_Java泛型快速教程

java泛型视频教程泛型是Java SE 5.0引入的一种Java功能&#xff0c;在其发布几年后&#xff0c;我发誓那里的每个Java程序员不仅会听说过&#xff0c;而且已经使用过。 关于Java泛型&#xff0c;有很多免费和商业资源&#xff0c;而我使用的最佳资源是&#xff1a; Java教程 …

Windows上的Oracle Java

我最近为基于Windows 7的笔记本电脑下载了JDK 9的早期访问版本 &#xff08;内部版本68 &#xff09;。 由于这是早期版本&#xff0c;因此当自动安装在笔记本电脑上安装主要Java Runtime Environment&#xff08;JRE&#xff09;引入了一些不太理想的问题时&#xff0c;我并不…

DM oracle Mysql 查询数据库表和字段

-----------------------------------------------------ORALCE、DM select * from user_tab_comments;--查询当前用户下的表注释 select * from user_col_comments;--查询当前用户下的字段注释 select * from dba_tables ;--查询数据库实例下的表 属性 select * from dba_t…

java synchronized 对指定代码添加锁-简单样例

1:对静态代码添加锁 private final static Object syncLock new Object(); // 相当于线程锁,用于线程安全 public static int n0; public static void main(String[] args) { synchronized (syncLock){//锁 for(int i0;i<100;i) { n; Syst…

使用无锁的方式和有锁的方式的程序性能对比

这里分别使用有锁和无锁两种方式&#xff0c;对一个数值进行增加&#xff0c;一直增加到100000&#xff0c;然后输出使用时间的长短。 1 import java.util.concurrent.ExecutorService;2 import java.util.concurrent.Executors;3 import java.util.concurrent.TimeUnit;4 impo…