假设我有一个包含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),那么有人可以对两种方法中的哪一种有所了解关于。 (我主要担心的是代码应该更小但可读)
答案 0 :(得分:2)
我不确定为什么会违反“单一责任原则”;你的对象除了它的状态和/或身份之外没有任何改变。
还有一个警告:如果你的对象不需要所有的参数,它真的是那种类型还是应该被设计/分段成两个(或更多)对象?假设你正在塑造一只狗。难道你不需要它所需要的一切,并且像狗一样行事吗?如果没有,那么......你有什么样的动物/狗;或者,你真的有一只狗吗?这有很多观点,但我很确定你明白了。
如果您的对象需要太多参数(Hibernate实体不会从中逃脱),同样适用。
无论如何,请确保初始化真正需要的东西。然后在需要时使用“setter”。您可以使用初始方法实现相同目的。有关构建器模式的示例,请查看here。无论如何,我坚信不可变性,在这种情况下构建器模式违反了这一点,但我们应该灵活一些。
答案 1 :(得分:1)
规则是使用构造函数来获取所需的参数。但是,如果您有许多必需参数,那么构建器模式可能非常有用: When would you use the Builder Pattern?
优点是构建器模式不违反构造函数中所需参数的规则。
如果您有一些必需的参数,那么不使用构建器模式可能会更好。