java - 构建器模式与依赖注入(inject)(例如通过 Guice)

标签 java dependency-injection guice

我正在开发一个简单的树结构数据库,我通常通过构建器(构建器模式)设置依赖项或可选设置。现在我不确定何时使用 Guice,何时使用 Builder 模式以及何时使用静态工厂方法而不是构造函数本身。我读过 Effective Java 好几遍,我认为它至少提到了很多不公开构造函数的优点。是时候重读 ;-)

那么,您知道哪些案例可以清楚地区分吗?我不应该公开构造函数吗?因此,例如在每种情况下都写 public static Foo getInstance(...) { return new Foo(...)}?

最佳答案

我坚信您不需要为所有 使用依赖注入(inject)。

  • 对于 LookupService 来说,注入(inject) Dictionary 是很自然的,这样它的实现就可以通过配置换出。

  • 另一方面,对于防火墙。它很自然地创建自己的 FireWallRules,也许通过提供的 FactoryBuilder

作为准则,注入(inject)您需要配置的内容,不要自动注入(inject)其他所有内容。


考虑静态工厂 (*)

  • 需要命名构造逻辑。例如,Lists.newArrayList()
  • 结构太复杂了,不属于类本身
  • 不需要工厂配置,工厂没有副作用

考虑实例工厂

  • 存在复杂的实例化逻辑
  • 需要配置工厂
  • 使用AbstractFactory设计模式
  • 需要在整个程序生命周期中创建额外的对象

  • 有复杂的参数选择。例如,5 个参数,其中一些是可选的。

(*) 静态方法并不总是可测试的,在我看来,静态方法的存在应该始终是有动机的。 工厂的典型用例是减少耦合。通过使用静态工厂,这种能力就完全丧失了。

关于java - 构建器模式与依赖注入(inject)(例如通过 Guice),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12520678/

相关文章:

java - 最终静态字符串编译问题。任何建议如何避免?

java - java中继承情况下的同步

java - DDD 中的聚合对象

java - Guice:类或实例级绑定(bind)注释

java - 如何使用guice注入(inject)将Class注入(inject)到具有静态方法的类中?

java - Spring 批处理 :How to monitor currently running jobs & show progress on jsp page

c# - 是否可以将接口(interface)作为松散耦合的参数

c# - 使用 Unity 注入(inject)数组

java - Google Guice 与 PicoContainer 的依赖注入(inject)

java - 具有依赖注入(inject)的两个单例实例(Google Guice)