本篇文章对应的是官网【8. Mapping Values】的相关内容。
首先弄清官网中说的source和target,例如要把实例A的内容给实例B,那么实例A就是source,实例B就是target。source这就咱就称它为源,target成为目标
1.将一个枚举类型的值给另外一个枚举类型
先上代码,然后讲解
- public enum EnumA {
- FOOTBALL,BASKETBALL;
- }
-
- public enum EnumB {
- FOOTBALL,BASKETBALL;
- }
-
- @Mapper
- public interface EnumMapper {
- EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
- EnumB change(EnumA enumA);
- }
- public class Test {
- public static void main(String[] args) {
- EnumA enu = EnumA.BASKETBALL;
- EnumB enub = EnumB.FOOTBALL;//作用是为了证明最后通过mapper把EnumA的值传给了他
- enub = EnumMapper.INSTANCE.change(enu);
- System.out.println(enub); //BASKETBALL
- }
- }
注意观察代码中2个枚举中的两个属性(在官网中也被成为Constant,无所谓不要太在意)是相同的,官网说过当两个枚举里面的内容相同时,那么Mapper会自动进行映射赋值,也就是change方法就会自动完成这些事情,就是这么简单。
那么如果两个枚举中的内容不相同,怎么办呢?我们就通过@ValueMappings映射一下就行,看下面例子:
- public enum EnumA {
- FOOTBALL,BASKETBALL;
- }
-
- public enum EnumB {
- FOOTBALL1,BASKETBALL
- }
-
- @Mapper
- public interface EnumMapper {
- EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
- @ValueMappings({
- @ValueMapping( source = "FOOTBALL" , target = "FOOTBALL1")
- })
- EnumB change(EnumA enumA);
- }
-
- public class Test {
- public static void main(String[] args) {
- EnumB enub = EnumMapper.INSTANCE.change( EnumA.FOOTBALL);
- System.out.println(enub); // FOOTBALL1
- }
- }
可以看到,当两个枚举中内容不同时,要让他们映射起来就要使用@ValueMappings,作用就是当在枚举A中选择了某个值(FOOTBALL),那么转换成枚举B时,就告诉枚举B根据映射关系,此时你的值应该是target指定的FOOTABLL1。这个有可能有点绕,大家在好好理一理。用法其实很简单。
2. 字符串类型和枚举类型之间的映射
这个其实很简单,就是修改Mapper中返回值或者参数的类型就行了。拿枚举到字符串之间的映射来举例:
- public enum EnumA {
- FOOTBALL,BASKETBALL;
- }
-
- @Mapper
- public interface EnumMapper {
- EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
- String change(EnumA enumA);
- }
- public class Test {
- public static void main(String[] args) {
- String str = EnumMapper.INSTANCE.change( EnumA.FOOTBALL);
- System.out.println(str); // FOOTBALL
- }
- }
可以看到最后枚举的值被映射到字符串类型的str中了。
3.枚举通过后缀方式映射
上面讲过如果两个枚举中的内容不通,那么需要通过@ValueMappings来指定映射关系,那么如果不使用这个注解,还有什么方式呢?就是这里说的后缀的方式。这种方式的前提是枚举A中的内容加上一个特定后缀后,能够与枚举B中的内容相同才行,看例子:
- public enum EnumA {
- FOOT,BASKET;
- }
- public enum EnumB {
- FOOT_BALL,BASKET_BALL
- }
- @Mapper
- public interface EnumMapper {
- EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
- @EnumMapping(nameTransformationStrategy = "suffix", configuration = "_BALL")
- EnumB change(EnumA enumA);
- }
- public class Test {
- public static void main(String[] args) {
- EnumB enumB = EnumMapper.INSTANCE.change( EnumA.FOOT);
- System.out.println(enumB); // FOOT_BALL
- }
- }
看上面代码,注意观察两个枚举,EnumB显然比EnumA多了_BALL这个后缀,那么在Mapper中就可以设置通过后缀模式来映射,这样就将两个枚举映射起来了。在EnumA中设置的FOOT,到了EnumB中就成了FOOT_BALL了。
除了后缀模式,还有前缀模式等多种模式,大家可以看源码和官网。道理相同,这里就不多做说明了