填充对象时Java返回方法的好习惯

时间:2015-06-16 14:30:25

标签: java

对于含糊不清的标题感到抱歉。如果有人有更好的解释方法,我会编辑。

假设我有一个类,我创建了许多实例,并且有许多属性可以通过不同的方法填充。传递对象并填充方法中的属性是不好的做法吗?我将尝试用一个例子来解释,我试图简化:

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方法来填充属性并让我的方法返回属性类型。 (这有点清楚吗?)

2 个答案:

答案 0 :(得分:2)

是的,最好让getNameFromSomewhere()返回值,而不是让它接受用户对象并调用setter。这有两个原因:

  1. 您想要解耦User类公开的接口。因此,当您将姓氏重构为姓氏时,您无需更改getNameFromSomewhere()
  2. 除了User之外,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;    
}

通过这种方式,您可以确定用户来自何处以及无法在其他任何位置进行修改。此外,此代码符合单一责任原则,因为方法getNameFromSomewheregetSurnameFromSomewhere只负责检索姓名/姓氏。

最佳方法应该是使用User类的不可变实现的方法。这意味着每次需要修改对象时,都会从中创建一个副本,并更改​​所需的信息。这样整个测试过程就变得简单了。