java - 我应该如何填充我的对象?

标签 java oop object paradigms

我有一个想要填充信息的对象。我从许多不同的服务中检索信息。我创建了一个辅助类,它有一个公共(public)方法,然后有许多私有(private)方法来完成调用服务的工作。我所写的工作正常,但我不确定这是否是正确的方法。

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

我的方法有什么问题吗?我应该遵循一个编程范例来做这样的事情吗?

示例:

Person 对象,带有名字、姓氏、年龄、高度、体重、最喜欢的食物列表、最喜欢的国家列表、评论列表的 getter 和 setter。

  • 服务 1 提供名字、姓氏、年龄、高度和体重
  • 服务2 给出最喜欢的国家列表和最喜欢的食物列表
  • 服务 3 给出该人发表的评论列表

我有一个 personH​​elper 类,如下所示:

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;
}

}

然后在我的 Controller 中调用

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

return jsonResponse; // returns the ajax response to js

预先感谢您的任何帮助或建议。

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

最佳答案

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

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

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();
    }
}

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

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

在我看来,您的“UserDetails”对象可以变成一种构建器。因此,您的“PersonH​​elper”类最终只会调用 userDetails.build(),而不是了解 Person 对象(和 userDetails 对象)包含哪些字段。

关于java - 我应该如何填充我的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34253161/

相关文章:

java - 异常 [EclipseLink-4003](Eclipse 持久性服务 - 2.3.0.v20110604-r9504):

java - 将值设置为名称与字符串数据匹配的类变量

matlab - 需要一个好的MATLAB类教程

oop - 无状态面向对象编程与功能编程?

javascript - 如何将两个javascript数组合并为一个并按日期分组

javascript - 在javascript中将另一个数组中的数组对象打印为特定格式

java - 尝试释放 WakeLock 时强行关闭?

具有泛型集合的类的 Java 适当扩展设计

algorithm - 在要求事先解决编程挑战时,statups 期望什么?

javascript - 循环从二维数组创建对象键和值