当前位置: 首页 > 知识库问答 >
问题:

如何填充对象?

通学真
2023-03-14

我有一个要填充信息的对象。我从许多不同的服务中检索信息。我做了一个助手类,它有一个公共方法,然后有许多私有方法来调用服务。我写的东西很好,但我不确定这是否是正确的方法。

您可能想知道为什么我需要一个包含所有这些信息的对象。我需要它全部在一个对象中,因为我从这个java对象创建了一个json对象并将其传递给javascript层。

我的方法有什么问题?我是否应该遵循一种编程范式来做这样的事情?

例子:

Person对象的名字、姓氏、年龄、身高、体重、最喜欢的食物列表、最喜欢的国家列表、评论列表都有getters和setters。

  • 服务1提供名字、姓氏、年龄、身高和体重
  • 服务2提供最喜爱的国家和最喜爱的食物列表
  • 服务3提供了该人员的评论列表

我有一个personHelper类,如下所示:

public class PersonHelper{

public Person getPerson(userDetails){
    Person person = new Person();
    this.setPersonDetails(person, userDetails);
    this.setFavourites(person, userDetails);
    this.setComments(person, userDetails);

    return person;
}

private Person setPersonalDetails(Person person, UserDetails userDetails){

    returnedObj = callToService1(userDetails);
    person.setFirstName(returnedObj.getFirstName());
    person.setLastName(returnedObj.getLastName());
    person.setAge(returnedObj.getAge());
    person.setHeight(returnedObj.getHeight();
    person.setWeight(returnedObj.getWeight());

    return person;
}

private Person setFavourites(Person person, UserDetails userDetails){

    <List>favsList = callToService2(userDetails);
    person.setFavourites(returnedObj.getFavs(favsList));

    return person;
}

private Person setComments(Person person, UserDetails userDetails){

    <List>commentsList = callToService3(userDetails);
    person.setComments(returnedObj.getComments(commentsList));

    return person;
}

}

然后在我的控制器中我呼叫

person = personHelper.getPerson(userDetails);
jsonResponse = jsonProcessor.writeAsString(person);

return jsonResponse; // returns the ajax response to js

提前感谢您的帮助或建议。

编辑:经过更多的研究,我发现我正在填充的对象被称为数据传输对象,我正在使用JavaBean方法填充它。

共有2个答案

游炳
2023-03-14

您的问题没有一般的范式,但这里有一些设计技巧:

>

  • 您的个人数据(姓名、收藏夹)似乎分布在多个数据存储中,您必须在PersonHelper类中获取所有这些数据。我不知道这个服务是否在其他地方使用,但从控制器的角度来看,这个助手也应该是一个服务。

    由于您的服务调用是独立的,因此您可以并行执行它们

    对于某些类型的应用程序,如果您在UI级别公开这些服务,效果会更好。例如,如果数据显示在不同的UI块中,客户端可以发出多个异步请求,并在收到响应后立即显示数据。

  • 苏边浩
    2023-03-14

    现在有一种趋势是限制对象的可变性,因此基于setter的方法虽然可行,但有时并不被视为创建对象的最佳方法,甚至是对象的数据传输类型。另一件需要考虑的事情是,有多少对象相互了解,以及它们了解多少-似乎PersonHelper类需要了解关于UserDetails和Person的几乎所有信息。因此,如果向Person添加字段,则需要将其添加到UserDetails,并添加到PersonHelper以填充该字段。

    对于您的对象类型,您可能会发现Builder模式很有用。构建器是一个短期瞬态对象,旨在收集数据进行构建。通常构建器将拥有流畅的API,并被传递给传输类的(私有)构造函数。这意味着您负责构建对象的所有代码都很清楚这是它的责任,因为它与Builder一起工作。同时,构造的传输对象实际上是不可变的,并且更容易推理代码的线程安全性并了解某些东西在不同部分可能具有的值。

    public class Person {
        private final String firstName;
        private final String lastName;
    
        private Person(final PersonBuilder builder) {
            this.firstName = builder.firstName;
            this.lastName = builder.lastName;
        }
        ... usual getters etc ...
    
        public static class PersonBuilder {
            private String firstName;
            private String lastName;
    
            private PersonBuilder() {
            }
    
            public PersonBuilder withFirstName(final String name) {
                this.firstName = name;
                return this;
            }
    
            public PersonBuilder withLastName(final String name) {
                this.lastName = name;
                return this;
            }
    
            public Person build() {
                return new Person(this);
            }
        }
    
        public static PersonBuilder newPerson() {
            return new PersonBuilder();
        }
    }
    

    在这个例子中,构建器有点过于笨拙,但是当你有二三十个不同的数据时,这些数据在某种程度上是可选的,它就有意义了,并且非常容易阅读构建代码...

    Person.newPerson().withFirstName("Sam").withLastName("Spade").build()
    

    在我看来,您的“UserDetails”对象可以变成一种生成器。因此,您的“PersonHelper”类最终只会调用userDetails。build()而不是完全了解Person对象(和userDetails对象)包含的字段。

     类似资料:
    • 在这里,我试图通过使用来填充我的对象数组。问题是,我得到了一个错误,指出数组在1处超出了索引 此外,文件中的每个标记都由一个空格分隔,这样我就可以在字符串数组中拆分标记,并在属性上进行拆分 文件内容 (名称,作者,发布,编号,版权,科学) 那么有人能帮我写代码吗?或者甚至建议另一种方法?

    • 作为一项任务,我被要求制作一个Swing GUI。在第一部分中,我创建了一个()对象()。目前所需要的是对所述数组列表进行排序,并将其显示为GUI中的。我制作了一个,当按下它时,它应该进行排序和显示。 但是,一旦按下它将只显示表标题而不显示数组列表中的信息,我应该做什么不同的事情呢?我已经在下面包括了GUI类和main类。

    • 问题内容: 根据http://www.newtonsoft.com/json/help/html/PopulateObject.htm,您可以通过JSON字符串中定义的值来更新现有实例。我的问题是,我必须填充该对象的数据已经被解析为JToken对象。我当前的方法如下所示: 是否有更好的方法来完成此任务,而不必首先还原在创建JToken时已经完成的解析? 问题答案: 使用阅读器并将其传递给。返回的阅

    • 私有ListView ListViewGoogle; activity_listviewgoogle.xml: activity_my.xml:

    • 问题内容: 我需要用ArrayList填充JComboBox。有什么办法吗? 问题答案: 使用ArrayList类的方法并将其传递给 有关更多信息,请参见JavaDoc和教程。

    • 为什么下面的代码是错误的?< code >[T;N]转换为< code>Vec 错误: 游戏场