mirror of
https://github.com/mapstruct/mapstruct.git
synced 2025-07-12 00:00:08 +08:00
#92 Making generated code more null-safe and avoiding unnecessary collection instantiation
This commit is contained in:
parent
8dd505b63e
commit
d7864e0566
@ -39,7 +39,7 @@ public class PropertyMapping extends AbstractModelElement {
|
|||||||
private final String targetName;
|
private final String targetName;
|
||||||
private final String targetAccessorName;
|
private final String targetAccessorName;
|
||||||
private final Type targetType;
|
private final Type targetType;
|
||||||
private final boolean isHasTargetSetter;
|
private final boolean isTargetAccessorSetter;
|
||||||
|
|
||||||
private final MappingMethodReference mappingMethod;
|
private final MappingMethodReference mappingMethod;
|
||||||
private final TypeConversion conversion;
|
private final TypeConversion conversion;
|
||||||
@ -56,7 +56,7 @@ public class PropertyMapping extends AbstractModelElement {
|
|||||||
this.targetName = targetName;
|
this.targetName = targetName;
|
||||||
this.targetAccessorName = targetAccessorName;
|
this.targetAccessorName = targetAccessorName;
|
||||||
this.targetType = targetType;
|
this.targetType = targetType;
|
||||||
this.isHasTargetSetter = targetAccessorName.startsWith( "set" );
|
this.isTargetAccessorSetter = targetAccessorName.startsWith( "set" );
|
||||||
|
|
||||||
this.mappingMethod = mappingMethod;
|
this.mappingMethod = mappingMethod;
|
||||||
this.conversion = conversion;
|
this.conversion = conversion;
|
||||||
@ -98,8 +98,15 @@ public class PropertyMapping extends AbstractModelElement {
|
|||||||
return conversion;
|
return conversion;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isHasTargetSetter() {
|
/**
|
||||||
return isHasTargetSetter;
|
* Whether the target accessor is a setter method or not. The only case where it is not a setter but a getter is a
|
||||||
|
* collection-typed property without a getter, to which elements are set by adding the source elements to the
|
||||||
|
* collection retrieved via the getter.
|
||||||
|
*
|
||||||
|
* @return {@code true} if the target accessor is a setter, {@code false} otherwise
|
||||||
|
*/
|
||||||
|
public boolean isTargetAccessorSetter() {
|
||||||
|
return isTargetAccessorSetter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -20,11 +20,11 @@
|
|||||||
-->
|
-->
|
||||||
<#-- a) invoke mapping method -->
|
<#-- a) invoke mapping method -->
|
||||||
<#if mappingMethod??>
|
<#if mappingMethod??>
|
||||||
<#if hasTargetSetter>
|
<#if targetAccessorSetter>
|
||||||
${ext.targetBeanName}.${targetAccessorName}( <@includeModel object=mappingMethod input="${sourceBeanName}.${sourceAccessorName}()"/> );
|
${ext.targetBeanName}.${targetAccessorName}( <@includeModel object=mappingMethod input="${sourceBeanName}.${sourceAccessorName}()"/> );
|
||||||
<#else>
|
<#elseif targetType.collectionType>
|
||||||
if ( ${sourceBeanName}.${sourceAccessorName}() != null ) {
|
if ( ${sourceBeanName}.${sourceAccessorName}() != null && ${ext.targetBeanName}.${targetAccessorName}() != null ) {
|
||||||
${ext.targetBeanName}.${targetAccessorName}().addAll( <@includeModel object=mappingMethod input="${sourceBeanName}.${sourceAccessorName}()"/> );
|
${ext.targetBeanName}.${targetAccessorName}().addAll( <@includeModel object=mappingMethod input="${sourceBeanName}.${sourceAccessorName}()"/> );
|
||||||
}
|
}
|
||||||
</#if>
|
</#if>
|
||||||
<#-- b) simple conversion -->
|
<#-- b) simple conversion -->
|
||||||
@ -39,13 +39,15 @@ if ( ${sourceBeanName}.${sourceAccessorName}() != null ) {
|
|||||||
<#-- c) simply set -->
|
<#-- c) simply set -->
|
||||||
<#else>
|
<#else>
|
||||||
<#if targetType.collectionType || targetType.mapType>
|
<#if targetType.collectionType || targetType.mapType>
|
||||||
|
<#if targetAccessorSetter>
|
||||||
if ( ${sourceBeanName}.${sourceAccessorName}() != null ) {
|
if ( ${sourceBeanName}.${sourceAccessorName}() != null ) {
|
||||||
<#if hasTargetSetter>
|
|
||||||
${ext.targetBeanName}.${targetAccessorName}( new <#if targetType.implementationType??><@includeModel object=targetType.implementationType/><#else><@includeModel object=targetType/></#if>( ${sourceBeanName}.${sourceAccessorName}() ) );
|
${ext.targetBeanName}.${targetAccessorName}( new <#if targetType.implementationType??><@includeModel object=targetType.implementationType/><#else><@includeModel object=targetType/></#if>( ${sourceBeanName}.${sourceAccessorName}() ) );
|
||||||
<#else>
|
|
||||||
${ext.targetBeanName}.${targetAccessorName}().addAll( new <#if targetType.implementationType??><@includeModel object=targetType.implementationType/><#else><@includeModel object=targetType/></#if>( ${sourceBeanName}.${sourceAccessorName}() ) );
|
|
||||||
</#if>
|
|
||||||
}
|
}
|
||||||
|
<#else>
|
||||||
|
if ( ${sourceBeanName}.${sourceAccessorName}() != null && ${ext.targetBeanName}.${targetAccessorName}() != null ) {
|
||||||
|
${ext.targetBeanName}.${targetAccessorName}().addAll( ${sourceBeanName}.${sourceAccessorName}() );
|
||||||
|
}
|
||||||
|
</#if>
|
||||||
<#else>
|
<#else>
|
||||||
${ext.targetBeanName}.${targetAccessorName}( ${sourceBeanName}.${sourceAccessorName}() );
|
${ext.targetBeanName}.${targetAccessorName}( ${sourceBeanName}.${sourceAccessorName}() );
|
||||||
</#if>
|
</#if>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user