我应该如何填充我的对象?
How should I populate my object?
我有一个对象,我想用信息填充它。我从许多不同的服务中检索信息。我制作了一个助手 class,它有一个 public 方法,然后有许多私有方法来完成调用服务的工作。我写的工作正常但我不确定这是否是正确的方法。
您可能想知道为什么我需要一个包含所有这些信息的对象。我需要一个对象中的所有内容,因为我从这个 java 对象创建了一个 json 对象并将其传递给 java 脚本层。
我的方法有什么问题,是否有我应该遵循的编程范例来做这样的事情?
示例:
人物对象 具有名字、姓氏、年龄、身高、体重、最喜欢的食物列表、最喜欢的国家列表、评论列表的 getter 和 setter。
- 服务 1 提供名字、姓氏、年龄、身高和体重
- 服务 2
给出最喜欢的国家列表和最喜欢的食物列表
- 服务
3给出了该人发表的评论列表
我有一个 personHelper class 看起来像这样:
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
在此先感谢您的帮助或建议。
编辑:经过更多研究,我发现我正在填充的对象称为数据传输对象,我正在使用 Java Bean 方法填充它。
您的问题没有通用范例,但这里有一些设计技巧:
您的个人数据(姓名、收藏夹)似乎分布在多个数据存储中,您必须将其全部收集到您的 PersonHelper class 中。我不知道这个服务是否在其他任何地方使用,但从控制器的角度来看,这个助手也应该是一个服务。
由于您的服务调用是独立的,因此您可以并行执行它们
对于某些类型的应用程序,如果您将这些服务公开到 UI 级别,效果会更好。例如,如果数据显示在不同的 UI 块中,客户端可以发出多个异步请求并在收到响应后立即显示数据。
最近有一种趋势是限制对象的可变性,因此您基于 setter 的方法虽然可行,但有时并不被视为创建对象的最佳方式,即使是数据传输类型的对象.另一件需要考虑的事情是有多少对象相互了解以及它们知道多少 - 似乎您的 PersonHelper class 需要知道关于 UserDetails 和 Person 的几乎所有内容。因此,如果您向 Person 添加一个字段,则需要将其添加到 UserDetails 并添加到 PersonHelper 以填充该字段。
对于您的对象类型,您可能会发现构建器模式很有用。构建器是一种短期瞬态对象,旨在收集构建数据。通常构建器会有一个流利的 API,并被传递给传输的(私有)构造函数 class。这意味着负责构建对象的所有代码都清楚这是它的责任,因为它与构建器一起工作。同时,构造的传输对象实际上是不可变的,并且更容易推断代码的线程安全性并理解某些东西 可能 在不同部分具有什么价值。
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' class 最终只会调用 userDetails.build() 而不是了解 Person 对象(和 userDetails 对象)包含哪些字段。
我有一个对象,我想用信息填充它。我从许多不同的服务中检索信息。我制作了一个助手 class,它有一个 public 方法,然后有许多私有方法来完成调用服务的工作。我写的工作正常但我不确定这是否是正确的方法。
您可能想知道为什么我需要一个包含所有这些信息的对象。我需要一个对象中的所有内容,因为我从这个 java 对象创建了一个 json 对象并将其传递给 java 脚本层。
我的方法有什么问题,是否有我应该遵循的编程范例来做这样的事情?
示例:
人物对象 具有名字、姓氏、年龄、身高、体重、最喜欢的食物列表、最喜欢的国家列表、评论列表的 getter 和 setter。
- 服务 1 提供名字、姓氏、年龄、身高和体重
- 服务 2 给出最喜欢的国家列表和最喜欢的食物列表
- 服务 3给出了该人发表的评论列表
我有一个 personHelper class 看起来像这样:
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
在此先感谢您的帮助或建议。
编辑:经过更多研究,我发现我正在填充的对象称为数据传输对象,我正在使用 Java Bean 方法填充它。
您的问题没有通用范例,但这里有一些设计技巧:
您的个人数据(姓名、收藏夹)似乎分布在多个数据存储中,您必须将其全部收集到您的 PersonHelper class 中。我不知道这个服务是否在其他任何地方使用,但从控制器的角度来看,这个助手也应该是一个服务。
由于您的服务调用是独立的,因此您可以并行执行它们
对于某些类型的应用程序,如果您将这些服务公开到 UI 级别,效果会更好。例如,如果数据显示在不同的 UI 块中,客户端可以发出多个异步请求并在收到响应后立即显示数据。
最近有一种趋势是限制对象的可变性,因此您基于 setter 的方法虽然可行,但有时并不被视为创建对象的最佳方式,即使是数据传输类型的对象.另一件需要考虑的事情是有多少对象相互了解以及它们知道多少 - 似乎您的 PersonHelper class 需要知道关于 UserDetails 和 Person 的几乎所有内容。因此,如果您向 Person 添加一个字段,则需要将其添加到 UserDetails 并添加到 PersonHelper 以填充该字段。
对于您的对象类型,您可能会发现构建器模式很有用。构建器是一种短期瞬态对象,旨在收集构建数据。通常构建器会有一个流利的 API,并被传递给传输的(私有)构造函数 class。这意味着负责构建对象的所有代码都清楚这是它的责任,因为它与构建器一起工作。同时,构造的传输对象实际上是不可变的,并且更容易推断代码的线程安全性并理解某些东西 可能 在不同部分具有什么价值。
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' class 最终只会调用 userDetails.build() 而不是了解 Person 对象(和 userDetails 对象)包含哪些字段。