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。原因有两个:

  • 您希望解耦用户类公开的接口。因此,当您将姓氏重构为familyname时,不需要更改
    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
    中的一个属性。因此,通过这种方式,您可以首先检索个人信息,然后构建
    用户
    对象。如果您同意我的答案,请检查它是否正确。如果你需要更多的帮助,请告诉我。