使用枚举在 J2EE 应用程序中将实体转换为 DTO?
Entity to DTO conversion in a J2EE application using an enum?
这是我什至不知道如何在 google 中搜索的主题之一(已经尝试过,大部分结果都是针对 C# 的),所以我开始:
我正在处理我们庞大的应用程序,试图开始使用一个全新的 DAO/Entity/Service/DTO.. 呃...东西。我或多或少地被留在了自己身边,而且,或多或少,我开始了解一些方法,也许还有一两个原因。
问题是我得到了从数据库到服务的所有方式 "up":
- 我有一个 DAO class,它执行存储在实体 class 上的查询。执行后,它 returns 具有值的实体。
- 该服务接收实体,并以某种方式将实体转换为 DTO,并 returns 将其转换为需要的任何时间。
我的问题是 "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 的猜测很有方向性。
这是我什至不知道如何在 google 中搜索的主题之一(已经尝试过,大部分结果都是针对 C# 的),所以我开始: 我正在处理我们庞大的应用程序,试图开始使用一个全新的 DAO/Entity/Service/DTO.. 呃...东西。我或多或少地被留在了自己身边,而且,或多或少,我开始了解一些方法,也许还有一两个原因。
问题是我得到了从数据库到服务的所有方式 "up":
- 我有一个 DAO class,它执行存储在实体 class 上的查询。执行后,它 returns 具有值的实体。
- 该服务接收实体,并以某种方式将实体转换为 DTO,并 returns 将其转换为需要的任何时间。
我的问题是 "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 的猜测很有方向性。