也许我在文档中错过了它,但我想知道应该如何处理“帮助对象”?
代码示例:
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;
}
我应该注入所有内容,还是应该在某个时候说算法“最了解”它需要什么?
我应该尝试消除每一个“新”吗?或者某些对象创建是否正常,例如 API 类,如 HashSet、ArrayList 等。
在更换一个简单的new
对于依赖注入,你需要问自己“why我在做这个吗?”...“什么real它有什么好处?”。如果答案是“我不知道”或“什么都没有”,那么你不应该这样做。
在这种情况下,我认为在示例代码的第一种情况下使用 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) {
...
}
最后要考虑的是,DI(在 Java 中)在某种程度上涉及反射,并且不可避免地比使用的经典方法更昂贵new
或工厂对象/方法。如果您不需要 DI 的额外灵活性,则不应为其付费。
我刚刚注意到您所指的两个变量是局部变量。我不知道有任何 DI 框架允许你注入局部变量......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)