【问题标题】:Java Converting ClassesJava 转换类
【发布时间】:2012-05-28 14:03:08
【问题描述】:

我有这样的课程:

Student
-name
-surname
-address
-number

我有一个 DTO,比如:

StudentDTO
-name
-surname
-number

我会将我的学生班级发送到另一个班级,只有姓名、姓氏和数字字段(我的意思不是所有字段),我决定将其命名为 DTO(我没有使用序列化等。只是我发送这个班级的对象作为任何其他类方法的参数)。

但是让我们假设我有这样一行代码:

getAllStudents();

它返回:

List<Student>

但我想将它分配给一个变量:

List<StudentDTO>

如何轻松转换它们?

PS:我无法更改我的 getAllStudents(); 方法的内部。我有学生列表,并且想要一种快速且设计良好的方法将对象列表转换为另一个对象列表。

【问题讨论】:

  • @Jeffrey 我已经编辑了我的问题。
  • 那么就不要使用 getAllStudents() 方法了。拿你的清单,把它扔到另一个你可以修改的方法中。

标签: java dto


【解决方案1】:

使用 Apache commons-beanutils:

PropertyUtils.copyProperties(studentDtoBean, studentBean);

【讨论】:

  • 虽然很简单,但我认为引入依赖并不值得。
  • @DavidB 我认为 commons-beanutils 存在于大多数应用程序中,因为许多开源库都在使用它,因此这种依赖关系可能已经存在。
【解决方案2】:
public StudentDTO convert() {
    StudentDTO newDTO = new StudentDTO(name, surname, number);
    return newDTO;
}

您可以将其实现为公共方法。

显然,这将被抽象为一个更大的转换方法,可以进行批处理。另一种选择是实现 Cloneable 并为 Student -> StudentDTO 创建一个特定的实现。

迭代示例:

List<StudentDTO> myList = new ArrayList<>();
    for (Student s : collection) {
        myList.add(s.convert());
    }
    return myList;

【讨论】:

  • 让学生了解 StudentDTO 是个好主意吗?在需要转换 bean 的情况下,我倾向于使用Converter&lt;FROM, TO&gt; 接口。这也使您可以选择使用功能样式将转换器应用于每个列表元素。
【解决方案3】:

您可以尝试将StudentDTO 更改为扩展Student

public StudentDTO extends Student {
}

请记住,您可以拥有address 属性,但无需使用它。如果你能做到,那么只需将你的方法的结果更改为:

public List<? extends Student> getAllStudents() {
    List<StudentDTO> lsStudentDTO = new ArrayList<StudentDTO>();
    //fill the list...
    return lsStudentDTO;
}

编辑:

您不是在更改内部代码,而是在更改方法定义:)。此外,您始终可以扩展方法,可能是

public List<? extends Student> getAllStudentsDTO() {
    //maybe you should add another logic here...
    return getAllStudents();
}

如果您甚至无法更改此行为,请使用 @DavidB 的答案。

【讨论】:

  • 不错的方法。但是我已经编辑了我的问题,我无法更改该方法中的代码。
  • 我从一个服务类中获取所有学生,它的接口定义是 List。更改方法定义不是问题,但我有许多其他不同的类(如经理、讲师等),更改所有方法定义并不容易。
  • 你一定从一开始就这么说。如果它来自服务,那么只需使用@DavidB 答案,您需要另一个将List&lt;Student&gt; 转换为List&lt;StudentDTO&gt; 的类,反之亦然。
【解决方案4】:

您可以从 StudentDTO 扩展 Student:

public class StudentDTO {
    name;
    surname;
    number;
}

public class Student extends StudentDTO {
    address;
}

比你能做的:

List<StudentDTO> dtoList = new ArrayList<StudentDTO>(getAllStudents());

【讨论】:

  • 即使Student 扩展StudentDTO,你也不能将List&lt;Student&gt; 隐式转换为List&lt;StudentDTO&gt;
  • 你不必改变你的 getAllStudents();方法
  • 您是否至少尝试过像List&lt;StudentDTO&gt; lsDTO; List&lt;Student&gt; ls;= new ArrayList&lt;Student&gt;(); lsDTO = ls;这样的事情?
猜你喜欢
  • 2021-07-14
  • 2018-09-23
  • 2018-10-05
  • 1970-01-01
  • 2017-04-10
  • 2013-08-17
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多