我应该注入执行算法所需的对象吗?我应该注射一切吗?

Abs*_*ind 5 java dependency-injection guice

也许我在文档中错过了它,但我想知道我应该如何处理"帮助对象"?

代码示例:

public Path dijkstra(Node startNode, Node endNode) {
    Set<Node> nodesToInspect = new HashSet<Node>();  // should this Object be injected?
    Path path = new Path();  // and this one?

    while (!nodesToInspect.isEmpty()) {
        // some logic like:
        path.add(currentNode);

    }

    return path;
}
Run Code Online (Sandbox Code Playgroud)

我应该注入一切还是应该在某种程度上说算法"最了解"它需要什么?我应该尝试消除每一个"新"吗?或者是一些对象创建很好,例如像HashSet,ArrayList等API类.

Ste*_*n C 2

在用依赖注入替换简单之前new,您需要问自己“为什么我要这样做?” ...“它有什么真正的好处?”。如果答案是“我不知道”或“什么都不知道”,那么你不应该这样做。

在这种情况下,我认为在示例代码的第一种情况下使用 DI 没有真正的好处。该方法之外的任何内容都不需要知道内部集合是如何表示的……甚至不需要知道它的存在。

您应该问的另一个问题是是否有更简单、更明显的方法来实现目标。例如,使用 DI 作为path变量的(最有可能)目的是允许应用程序使用不同的Path类。但最简单的方法是将实例作为显式参数传递Path给该方法。dijkstra您甚至可以使用重载来使其更容易接受;例如

public Path dijkstra(Node startNode, Node endNode) {
    return dijkstra(startNode, endNode, new Path());
}

public Path dijkstra(Node startNode, Node endNode, Path path) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

最后要考虑的是,DI(在 Java 中)在某种程度上涉及反射,并且不可避免地比使用new或工厂对象/方法的经典方法更昂贵。如果您不需要 DI 的额外灵活性,则不应为其付费。


我刚刚注意到您所指的两个变量是局部变量。我不知道有任何 DI 框架允许你注入局部变量......