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类.
在用依赖注入替换简单之前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 框架允许你注入局部变量......
| 归档时间: |
|
| 查看次数: |
147 次 |
| 最近记录: |