第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时,可以始终如一地从中获得最大的收益。

09-12 03:07