对于含糊不清的标题感到抱歉。如果有人有更好的解释方法,我会编辑。
假设我有一个类,我创建了许多实例,并且有许多属性可以通过不同的方法填充。传递对象并填充方法中的属性是不好的做法吗?我将尝试用一个例子来解释,我试图简化:
public class User {
private String surname;
private String name;
public String getSurname() {
return surname;
}
public void setSurname( String surname ) {
this.surname = surname;
}
public String getName() {
return name;
}
public void setName( String name ) {
this.name = name;
}
}
// Passing the object as parameter and returning the object in each methods
// In this case getNameFromSomewhere returns a User object
public User getUser(){ //edit: my mistake here
User user= new User();
user = getNameFromSomewhere(user);
user = getSurnameFromSomewhere(user);
return user;
}
在我的情况下,getNameFromSomewhere在服务器上进行搜索,我想知道是否应该更改我的所有方法,以便它返回一个字符串,就像属性一样,然后只做:
// Alternative ?
public User getUser(){ //edit: my mistake here
User user= new User();
user.setName(getNameFromSomewhere()); // getNameFromSomewhere return string
user.setName(getSurnameFromSomewhere());
return user;
}
*注意:我有要填充的string,int,list属性。 编辑:我写了一个替代方案,我只是想知道,性能明智,如果将User作为参数传递然后返回为每个属性填充1个属性或者如果我应该使用User.set方法来填充属性并让我的方法返回属性类型。 (这有点清楚吗?)
答案 0 :(得分:2)
是的,最好让getNameFromSomewhere()
返回值,而不是让它接受用户对象并调用setter。这有两个原因:
getNameFromSomewhere()
getNameFromSomewhere()
可能会用来填充其他bean的属性。答案 1 :(得分:2)
您的代码存在的问题是User
类通过 setter 方法公开其内部,破坏了信息隐藏原则。您的方法可能导致无法维护的代码库,即很难跟踪可能修改User
对象的所有组件。
我认为更好的方法是使用构造函数直接获取构建User
所需的信息。
public class User {
private String surname;
private String name;
public User(String name, String surname) {
this.name = name;
this.surname = surname;
}
public String getSurname() {
return surname;
}
public String getName() {
return name;
}
}
然后,您可以通过以下方式构建用户:
public User getUser() {
User user = new User(getNameFromSomewhere(),
getSurnameFromSomewhere());
return user;
}
通过这种方式,您可以确定用户来自何处以及无法在其他任何位置进行修改。此外,此代码符合单一责任原则,因为方法getNameFromSomewhere
和getSurnameFromSomewhere
只负责检索姓名/姓氏。
最佳方法应该是使用User
类的不可变实现的方法。这意味着每次需要修改对象时,都会从中创建一个副本,并更改所需的信息。这样整个测试过程就变得简单了。