gpt4 book ai didi

java - 创建新对象和依赖注入(inject)的区别

转载 作者:IT老高 更新时间:2023-10-28 21:03:52 27 4
gpt4 key购买 nike

创建新对象和依赖注入(inject)有什么区别?请详细说明。

最佳答案

嗯,它们不完全可比。您将始终必须通过在某些时候实例化一个类来创建一个新对象。依赖注入(inject)也需要创建新对象。

当您想要控制或验证您使用或想要测试的类所使用的实例的行为时,依赖注入(inject)真正发挥作用。 (对于测试驱动开发,依赖注入(inject)是除最小示例之外的所有示例的关键)。

假设一个Holder 类需要Handle 类的对象。传统的做法是让 Holder 实例创建并拥有它:

class Holder {
private Handle myHandle = new Handle();
public void handleIt() {
handle.handleIt();
}
}

Holder 实例创建了 myHandle,类外的任何人都无法获得它。在某些情况下,单元测试是其中之一,这是一个问题,因为如果不创建 Handle 实例就无法测试 Holder 类,而 Handle 实例又可能依赖于许多其他类和实例。这使得测试变得笨重和繁琐。

通过注入(inject) Handle 实例,例如在构造函数中,外部人员负责创建实例。

class Holder {
private Handle myHandle;

public Holder(Handle injectedHandle) {
myHandle = injectedHandle;
}

public void handleIt() {
handle.handleIt();
}
}

正如您所看到的,代码几乎相同,Handle 仍然是私有(private)的,但是 Holder 类现在与外部世界的耦合非常失败,这使得许多事情变得更简单。并且在测试 Holder 类时,可以注入(inject)模拟或 stub 对象而不是真实实例,从而可以验证或控制 Holder、其调用者和句柄之间的交互。

实际的注入(inject)将发生在其他地方,通常是一些“主”程序。有多种框架可以帮助您在不编程的情况下做到这一点,但本质上这是“主”程序中的代码:

...
private Handle myHandle = new Handle(); // Create the instance to inject
private Handler theHandler = new Handler(myHandle); // Inject the handle
...

本质上,注入(inject)只不过是一种花哨的set方法。当然,您可以使用它来实现注入(inject)机制,而不是像上面的简单示例那样在构造函数中实现。

关于java - 创建新对象和依赖注入(inject)的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3386889/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com