Java返回方法填充对象时的良好实践
很抱歉标题不明确。如果有人有更好的解释方法,我会编辑 假设我有一个类,我创建了它的许多实例,它有许多属性,这些属性由不同的方法填充。传递对象并填充方法中的属性是一种不好的做法吗?我将试着用一个简单的例子来解释:Java返回方法填充对象时的良好实践,java,Java,很抱歉标题不明确。如果有人有更好的解释方法,我会编辑 假设我有一个类,我创建了它的许多实例,它有许多属性,这些属性由不同的方法填充。传递对象并填充方法中的属性是一种不好的做法吗?我将试着用一个简单的例子来解释: public class User { private String surname; private String name; public String getSurname() { return surname; } public
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;
}
在我的例子中,GetNameFromwhere在服务器上执行搜索,我想知道是否应该更改所有方法,使其返回一个与属性类似的字符串,然后执行以下操作:
// 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.set方法填充属性并让我的方法返回属性类型。(这是否更清楚?是的,最好让
getnamefromwhere()
返回值,而不是让它接受用户对象并调用setter。原因有两个:
GetNameFrom某地()
getNameFromSomewhere()
来填充用户之外的其他bean的属性代码的问题是,
User
类通过setter方法公开其内部,从而打破了信息隐藏原则。您的方法可能会导致无法维护的代码库,也就是说,很难跟踪可能修改用户
对象的所有组件
我认为更好的方法是让构造函数直接获取构建用户所需的信息
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;
}
通过这种方式,您可以确定用户来自何处,并且不能在其他任何地方对其进行修改。此外,此代码符合单一责任原则,因为方法getnamefromwhere
和getnamefromwhere
只负责检索名称/姓氏
最佳方法应该是使用User
类的不变实现。这意味着每次需要修改对象时,都要从对象创建一个副本,并更改所需的信息。这样整个测试过程就变得简单了。好吧,对不起,我不明白你想达到什么目的。这不是你已经在做的吗?你应该包括你(尽管不是我们)心目中的备选方案。还有什么方法可以避免传递用户?如果要通过参数获取用户,为什么需要执行user user=new user()代码>?您已经使用了该名称。如果方法本身返回User
类的对象,则无需在getUser(…)
方法内实例化User
引用。方法接受一个参数,尽管它正在创建一个新的用户
,但创建用户
的工作已委托给第三个函数,该函数本身创建一个用户。为什么要在每个角落创建new User()
,为什么不让User
只在一个地方创建,只需使用一个变量来保存该引用。您知道这是否会影响性能/内存?比如,我是在创建可能会留在内存中的拷贝,还是java在使用后会把所有东西都扔掉?我喜欢你回答的第二点。我有一些方法可以同时搜索3个属性,我应该使用传递用户并返回的方法吗?或者返回一个数组并在之后设置属性?性能/效率方面应该没有区别。关于获取多个属性的getter,我会选择三个getter,它们调用执行搜索的相同方法,并实现一些缓存机制,以便实际的搜索执行一次(假设三个getter的调用非常接近),谢谢!这听起来很合乎逻辑。我同意我做事的方式违反了一些原则。我试图改变它,但我遇到了另一个问题:我使用的一些方法设置了用户的许多属性,例如:公共用户getPersonalInfo(用户用户用户),它从单个ldap搜索设置名称、姓氏、电子邮件、电话等。有没有一种不使用user作为参数和返回语句而遵循这些原则的好方法?如果user
中的属性太多,可能应该将其拆分为较小的类型。正如您在评论中提到的,尝试创建一个PersonalInfo
类型,并将其作为User
中的一个属性。因此,通过这种方式,您可以首先检索个人信息,然后构建用户
对象。如果您同意我的答案,请检查它是否正确。如果你需要更多的帮助,请告诉我。