为什么不建议在依赖注入时传递null?

时间:2015-11-21 19:10:35

标签: java dependency-injection

假设我有一个包含3个变量的类

class User{
    private int userId;
    private String userFirstName;
    private String userLastName;
}

现在,我可以像这样创建它的setter方法

public User setUserId(int userId){
    this.userId = userId;
    return this;
}

它可以让我像这样做链接

User user = new User().setUserId(1).setFirstName("fName");  

我建议不要以这种方式创建对象,因为它是一种反模式。基本上,给我的原因是我使用setter来设置变量的值,并且还返回对象本身(从而违反单一责任原则),我认为这不是真的。但是,另一种向我建议的方法是创建一个包含所有变量的构造函数。

public User(int userId, String userFirstName, String userLastName){
    this.userId = userId;
    this.userFirstName = userFirstName;
    this.userLastName = userLastName;
}

并像这样称呼它

User user = new User(1, "fName" , null);  

LastName将为null,就像之前的情况一样,我不认为它也是正确的(将null作为参数值传递)。
这只是一个例子。如果我有10个不同的变量并且我不想以正常方式使用setter(即在创建用户对象之后在一行代码中调用每个setter),那么有人可以对两种方法中的哪一种有所了解关于。 (我主要担心的是代码应该更小但可读

2 个答案:

答案 0 :(得分:2)

我不确定为什么会违反“单一责任原则”;你的对象除了它的状态和/或身份之外没有任何改变。

还有一个警告:如果你的对象不需要所有的参数,它真的是那种类型还是应该被设计/分段成两个(或更多)对象?假设你正在塑造一只狗。难道你不需要它所需要的一切,并且像狗一样行事吗?如果没有,那么......你有什么样的动物/狗;或者,你真的有一只狗吗?这有很多观点,但我很确定你明白了。

如果您的对象需要太多参数(Hibernate实体不会从中逃脱),同样适用。

无论如何,请确保初始化真正需要的东西。然后在需要时使用“setter”。您可以使用初始方法实现相同目的。有关构建器模式的示例,请查看here。无论如何,我坚信不可变性,在这种情况下构建器模式违反了这一点,但我们应该灵活一些。

答案 1 :(得分:1)

规则是使用构造函数来获取所需的参数。但是,如果您有许多必需参数,那么构建器模式可能非常有用: When would you use the Builder Pattern?

优点是构建器模式不违反构造函数中所需参数的规则。

如果您有一些必需的参数,那么使用构建器模式可能会更好。