Answers:
那这个呢?
如果您有一个班级,Employee
并且此雇员有一个班级,则Address
可以Employee
按以下方式定义班级:
class Employee {
private Address address;
// constructor
public Employee( Address newAddress ) {
this.address = newAddress;
}
public Address getAddress() {
return this.address;
}
public void setAddress( Address newAddress ) {
this.address = newAddress;
}
}
到目前为止一切都很好。
此代码显示了员工与其地址之间的HAS-A关系,这很好。
现在,这种HAS-A关系在它们之间创建了依赖关系。问题出在构造函数之内。
每次要创建Employee
实例时,都需要一个Address
实例:
Address someAddress = ....
Employee oscar = new Employee( someAddress );
以这种方式工作变得成问题,尤其是 当您要执行单元测试时。
当你需要测试一个特定的对象,主要问题就来了,你需要创建其他对象的实例,并最有可能你需要再创建实例等对象做到这一点。链条可能变得难以管理。
为了避免这种情况,您可以像这样更改构造函数:
public Employee(){
}
使用no args构造函数。
然后,您可以根据需要设置地址:
Address someAddress = ....
Employee oscar = new Employee();
oscar.setAddress( someAddress );
现在,如果您具有多个属性或对象难以创建,那么这可能会很麻烦。
但是,考虑一下,假设您添加了Department
属性:
class Employee {
private Address address;
private Department department;
....
如果您有300名员工,并且所有人都需要有一个相同的部门,并且必须在其他一些对象(例如,部门的公司列表或每个部门具有的角色等)之间共享同一部门,那么您将很难理解Department
对象的可见性,并无法通过所有对象网络共享它。
什么是依赖注入是所有关于它来帮你,好了,“注入”在你的代码这些依赖关系。大多数框架允许您通过在外部文件中指定要注入的对象来执行此操作。
假设一个虚拟的依赖注入程序的属性文件:
#mock employee
employee.address = MockAddress.class
employee.department = MockDepartment.class
#production setup
employee.address = RealAddress.class
employee.department = RealDepartment.class
您将定义为给定场景注入的内容。
Dependency Injector框架将为您设置正确的对象,因此您无需编写代码setAddress
或setDepartment
。这可以通过反射或代码生成或其他技术来完成。
因此,下次您需要测试Employee
该类时,可以注入模拟Address
和Departments
对象,而不必为所有测试编写所有的set / get。更好的是,您可以在生产代码中注入实物 Address
和Department
对象,并且仍然对代码在测试时的工作充满信心。
差不多了。
我仍然认为您所要求的解释不适合5岁儿童使用。
我希望您仍然觉得它有用。
编写类时,自然会利用其他对象。例如,您可能具有数据库连接,或者您使用的某些其他服务。这些其他对象(或服务)是依赖项。编写代码的最简单方法就是简单地创建和使用其他对象。但是,这意味着您的对象与这些依赖关系之间存在僵化的关系:无论为什么调用对象,它都使用相同的依赖关系。
一种更强大的技术是能够创建您的对象并为其提供要使用的依赖项。因此,您可以创建要使用的数据库连接,然后将其交给您的对象。这样,您可以在不同的时间创建具有不同依赖性的对象,从而使对象更加灵活。这是依赖项注入,您可以在其中将依赖项“注入”到对象中。
顺便说一句:在使用flickr照片来说明概念的现代演示风格中,这可以用瘾君子用毒品自焚来说明。哦,等等,这是注入依赖...好吧,抱歉,恶作剧。
当您获得新的任天堂时,您只需使用按钮和触摸屏即可玩游戏。
但是在任天堂工厂,他们需要知道如何组装在一起。
当工厂里的聪明人拿出Nintendo DS时,内部将有所不同,但是您仍然会知道如何使用它。