在OOP中我们不想要课程的耦合。如果我想在类a中使用类b的实例,我可以使用依赖注入。
但是,如果我想在类a中使用类b的静态方法,我看不到任何选项,但要"要求"或者" import"类中的类b是一个类文件。这最终会导致类之间的耦合 - 违背OOP原则。但另一种方法是将类b的静态方法重写为类a中的静态方法 - 违反DRY原则。什么是正确的方法?
这个问题被标记为How to use Dependency Injection with Static Methods?的可能副本,但我觉得我的问题是从更通用的角度提出要求使用另一个类'静态方法。认为可能重复中的问题和接受的答案更具体地针对用例,但是不适用于例如外部类中的实用程序静态方法。我的问题旨在从一般的oop角度寻求答案。
答案 0 :(得分:1)
这里有各种各样的选项,具体的用例对决定你想做什么很重要。所以,三巨头将是......
将静态方法从B类移植到共享库类中,该类纯粹是静态方法的持有者,并且从未实例化(在Java中,您将构建构造函数private
和类{ {1}})。然后,类A和类B都可以在不依赖于彼此且不违反DRY原则的情况下访问该方法,并且对依赖于在同一类上定义的静态方法的依赖于库类并不比它更好或更差。
如果你在谈论的是一个静态方法,这个方法最适合B类,那么你可以隐藏某种提供者实例背后的方法调用,该实例是依赖注入到A类中的提供者实现只是在B上调用静态方法。如果你想真的很邪恶,那么提供者也可以被注入到B的实例中,但这可能是过度的。
可以将静态方法更改为新类的实例方法,该类是依赖注入A和B的。有时,这样可以让您隐藏实例中的某些状态而不是必须将参数传递给其他无状态的方法。
请注意,静态方法通常会导致OO术语出现问题,因此实际上只有第三个选项是“干净”的选项,它真正解耦类并正确地允许编码到接口。