第143页的The Pragmatic Programmer中提供了一个代码段,如下所示:
public class Colada {
private Blender myBlender;
private Vector myStuff;
public Colada() {
myBlender = new Blender();
myStuff = new Vector();
}
private doSomething() {
myBlender.addIngredients(myStuff.elements());
}
}
这遵守了得墨meter耳定律/最低知识原则。
是否最好替换为以下使用依赖注入的方法,并且有什么需要注意的地方?
public class Colada throws IllegalArgumentException {
private Blender myBlender;
private Vector myStuff;
public Colada(Blender blender, Vector stuff) {
if (null == blender) {
throw new IllegalArgumentException()
} else {
myBlender = blender;
}
if (null == stuff) {
throw new IllegalArgumentException()
} else {
myStuff = stuff;
}
}
public static Colada createDefaultInstance() {
Blender blender = new Blender();
Vector stuff = new Vector();
return new Colada(blender, stuff);
}
private doSomething() {
myBlender.addIngredients(myStuff.elements());
}
}
最佳答案
如何构造对象的创建是与对象公开的 API 分开的关注点。
Demeter的定律说明了类的API,而不是类的构造方式,因此,我认为构造函数注入与Demeter定律之间没有冲突。
就是说,一旦决定使用Dependency Injection,就应该小心以避免在创建对象时产生歧义。如果您继续提供无参数的构造函数或静态工厂方法,则人们可能会使用它而不是让外部调用者组成依赖关系层次结构。
每当开发人员每次使用factory方法(或无参数构造函数)意外破坏依赖关系层次结构时,他们都会在该点引入紧密耦合。当您决定使用DI时,可以始终如一地从中获得最大的收益。