Java 在J2EE应用程序中使用枚举进行实体到DTO的转换?

Java 在J2EE应用程序中使用枚举进行实体到DTO的转换?,java,spring,entity-framework,enums,dto,Java,Spring,Entity Framework,Enums,Dto,这是我甚至不知道如何在谷歌上搜索的主题之一(已经尝试过了,大多数结果都是针对C的),所以我来: 我正在摆弄我们庞大的应用程序,试图使用一个全新的DAO/实体/服务/DTO。。嗯……事情。我或多或少都是一个人,而且,再一次,或多或少,我开始了解一些方法,也许还有一两个原因 问题是,从数据库到服务,我一路“向上”: 我得到了一个DAO类,它执行存储在实体类上的查询。执行后,它返回带有值的实体 服务接收实体,并以某种方式将实体转换为DTO,并在需要时将其返回给 我的问题是“不知何故”代码是这样的:

这是我甚至不知道如何在谷歌上搜索的主题之一(已经尝试过了,大多数结果都是针对C的),所以我来: 我正在摆弄我们庞大的应用程序,试图使用一个全新的DAO/实体/服务/DTO。。嗯……事情。我或多或少都是一个人,而且,再一次,或多或少,我开始了解一些方法,也许还有一两个原因

问题是,从数据库到服务,我一路“向上”:

  • 我得到了一个DAO类,它执行存储在实体类上的查询。执行后,它返回带有值的实体
  • 服务接收实体,并以某种方式将实体转换为DTO,并在需要时将其返回给
我的问题是“不知何故”代码是这样的:

DTOClass dto = ClassTransformerFromEntityToDTO.INSTANCE.apply(entityQueryResult);
我进入ClassTransformerRomentityTodto,发现了以下内容:

public enum ClassTransfomerFromEntityToDTO implements  Function<EntityClass,DTO Class> ) {
INSTANCE;

    @Override
    public DTOClass apply(EntityClass entityInstance) {
        /*Code to transform the Entity to DTO and the return*/
    }
}
公共枚举类TransformerFromEntityToToDo实现函数){
实例;
@凌驾
公共数据类应用(EntityClass entityInstance){
/*将实体转换为DTO并返回的代码*/
}
}
这个班。。。东西,工具,是这样的:

package com. google .common . base;

import com. google .common . annotations. GwtCompatible ;
import javax. annotation .Nullable ;

@GwtCompatible
public abstract interface Function <F , T >
{
  @Nullable
  public abstract T apply (@Nullable F paramF) ;

  public abstract boolean equals (@Nullable Object paramObject) ;
}
包com。谷歌,普通。基础
导入com。谷歌,普通。注释。GWT兼容;
导入javax。注释。可为空;
@GWT兼容
公共抽象接口函数
{
@可空
公共摘要不适用(@Nullable F paramF);
公共抽象布尔等于(@Nullable Object paramObject);
}
我在经典的“项目开始时逃到哪里的所有人”中,没有人知道这是为什么或这是什么(最聪明的人告诉我这可能与春天有关),因此,我有两个主要问题(或多或少可以在同一方面得到回答):

1) 这是什么?使用带有函数的枚举进行转换有什么意义


2) 这有什么意义?为什么我只能用一个函数创建一个类而忘记了这个魔法?

不确定这里有多少答案。。。我添加了一个答案,用我看过的一些代码来说明我的想法,但是你的代码太可怕了。事实上,我也有过类似的经历。我的猜测是,代码实际上在Spring之前。它被用作某种单身汉

我见过这样的代码,更糟糕的是:

public interface DTO {
    find(Object args)
}
public class ConcreteDTO1 implements DTO {
   ...
}
public class ConcreteDTO2 implements DTO {
   ...
}
public enum DTOType {

  CONCRETE_DTO1(new ConcreteDTO1(someArgs)),
  CONCRETE_DTO2(new ConcreteDTO2(someOtherArgs))

  private DTO dto;
  public DTOType(DTO dto) {
    this.dto = dto;
  }

  public DTO dto() {
    return dto;
  }
}
然后基本上通过枚举类型访问DTO:

DTOType.CONCRETE_DTO1.dto().find(args);
因此,每个试图获取DTO的人都会通过枚举访问它。对于Spring,您不需要任何这些。IoC容器是为了避免这种胡说八道,这就是为什么我猜测它在Spring之前,从Spring不存在时的一些古老版本的应用程序来看。但也有可能是有人天生就想做这样的事情,不管Spring是否已经出现在应用程序中。
对于你想做的事情,你最好使用访客模式。这里有一个不同答案的例子:

不确定这里有多少答案。。。我添加了一个答案,用我看过的一些代码来说明我的想法,但是你的代码太可怕了。事实上,我也有过类似的经历。我的猜测是,代码实际上在Spring之前。它被用作某种单身汉

我见过这样的代码,更糟糕的是:

public interface DTO {
    find(Object args)
}
public class ConcreteDTO1 implements DTO {
   ...
}
public class ConcreteDTO2 implements DTO {
   ...
}
public enum DTOType {

  CONCRETE_DTO1(new ConcreteDTO1(someArgs)),
  CONCRETE_DTO2(new ConcreteDTO2(someOtherArgs))

  private DTO dto;
  public DTOType(DTO dto) {
    this.dto = dto;
  }

  public DTO dto() {
    return dto;
  }
}
然后基本上通过枚举类型访问DTO:

DTOType.CONCRETE_DTO1.dto().find(args);
因此,每个试图获取DTO的人都会通过枚举访问它。对于Spring,您不需要任何这些。IoC容器是为了避免这种胡说八道,这就是为什么我猜测它在Spring之前,从Spring不存在时的一些古老版本的应用程序来看。但也有可能是有人天生就想做这样的事情,不管Spring是否已经出现在应用程序中。
对于你想做的事情,你最好使用访客模式。这里有一个不同答案的例子:

是我。来自未来

事实证明,这个构造至少在“有效的Java第二版”上是这样的


所以,是的,尤利斯的猜测很有针对性。

是我。来自未来

事实证明,这个构造至少在“有效的Java第二版”上是这样的


所以,是的,尤利斯的猜测很有针对性。

哈哈,我喜欢答案中包含“可怕”、“胡说八道”和“古老”这些词。。。我能(不知怎么的)理解伪单例的事情。。。但我的代码只是将一个CLA转换成另一个(新DTO,填充DTO的内容,返回DTO)。如果您不需要多个实例,请将函数设置为静态;如果您需要单例,请设置单例,但是。。。这我想我会被迫在工作时把这个文件放在“X档案”文件夹下…哈哈,我喜欢答案中包含“可怕”、“胡说八道”和“古老”这些词。。。我能(不知怎么的)理解伪单例的事情。。。但我的代码只是将一个CLA转换成另一个(新DTO,填充DTO的内容,返回DTO)。如果您不需要多个实例,请将函数设置为静态;如果您需要单例,请设置单例,但是。。。这我想我会被迫在工作时把这个文件放在“X-Files”文件夹下。。。