使用枚举在 J2EE 应用程序中将实体转换为 DTO?

Entity to DTO conversion in a J2EE application using an enum?

这是我什至不知道如何在 google 中搜索的主题之一(已经尝试过,大部分结果都是针对 C# 的),所以我开始: 我正在处理我们庞大的应用程序,试图开始使用一个全新的 DAO/Entity/Service/DTO.. 呃...东西。我或多或少地被留在了自己身边,而且,或多或少,我开始了解一些方法,也许还有一两个原因。

问题是我得到了从数据库到服务的所有方式 "up":

我的问题是 "somehow" 代码是这样的:

DTOClass dto = ClassTransformerFromEntityToDTO.INSTANCE.apply(entityQueryResult);

我进入 ClassTransformerFromEntityToDTO 并发现了这个:

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*/
    }
}

这个...东西实现的class是这样的:

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

我在classic "everyone who where at the beginning of the project fled",没人知道这是为什么,这是什么(最聪明的人告诉我,这可能与[=46有关=]), 所以,我有两个主要问题(可以在同一边得到或多或少的回答):

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

2) 这有什么意义?为什么我可以只做一个只有一个功能的 class 而忘记这个魔法?

不确定这里有多少要回答的问题...我正在添加一个答案来用我看过的一些代码来说明我的想法,但你的代码太糟糕了。我实际上看起来类似的东西。我的猜测是代码实际上在 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 是否已经在应用程序中。 对于您尝试做的那种事情,您最好使用访问者模式。这是来自不同答案的示例:passing different type of objects dynamically on same method

是我。来自未来。

原来这个构造是 a propossed Singleton Implementation,至少在 "Effective Java 2nd edition".

所以,是的,Ulise 的猜测很有方向性。