value-object.java.ftl 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package ${package.Domain}.model.valueobject;
  2. import java.io.Serializable;
  3. <#if swagger>
  4. <#if swaggerVersion == "swagger2">
  5. import io.swagger.annotations.ApiModel;
  6. import io.swagger.annotations.ApiModelProperty;
  7. <#elseif swaggerVersion == "openapi3">
  8. import io.swagger.v3.oas.annotations.media.Schema;
  9. </#if>
  10. </#if>
  11. /**
  12. * <p>${valueObjectName}值对象</p>
  13. *
  14. * <p>${valueObjectDescription},值对象是不可变的,通过值相等性进行比较。
  15. * 值对象没有唯一标识,通过其属性值来标识。</p>
  16. *
  17. * <p>值对象特性:
  18. * <ul>
  19. * <li>不可变性:值对象创建后不可修改</li>
  20. * <li>值相等性:通过属性值比较相等性,而非引用</li>
  21. * <li>无唯一标识:值对象没有ID,通过属性值标识</li>
  22. * <li>自包含:值对象包含完整的业务含义</li>
  23. * </ul>
  24. * </p>
  25. *
  26. * @author ${author}
  27. * @since ${date}
  28. */
  29. <#if swagger>
  30. <#if swaggerVersion == "swagger2">
  31. @ApiModel(value = "${valueObjectName}值对象", description = "${valueObjectDescription}")
  32. <#elseif swaggerVersion == "openapi3">
  33. @Schema(description = "${valueObjectDescription}")
  34. </#if>
  35. </#if>
  36. public class ${valueObjectName} implements Serializable {
  37. private static final long serialVersionUID = 1L;
  38. ## ---------- BEGIN 值对象字段 ----------
  39. <#list valueObjectFields as field>
  40. <#if field.comment?? && field.comment != "">
  41. /**
  42. * <p>${field.comment}</p>
  43. *
  44. * <p>${field.comment},${field.type}类型</p>
  45. */
  46. <#else>
  47. /**
  48. * <p>${field.propertyName}</p>
  49. */
  50. </#if>
  51. <#if swagger>
  52. <#if swaggerVersion == "swagger2">
  53. @ApiModelProperty(value = "${field.comment}")
  54. <#elseif swaggerVersion == "openapi3">
  55. @Schema(description = "${field.comment}")
  56. </#if>
  57. </#if>
  58. private final ${field.propertyType} ${field.propertyName};
  59. </#list>
  60. ## ---------- END 值对象字段 ----------
  61. /**
  62. * <p>创建${valueObjectName}值对象</p>
  63. *
  64. * <p>创建新的${valueObjectName}值对象实例。值对象创建后不可修改。</p>
  65. *
  66. <#list valueObjectFields as field>
  67. * @param ${field.propertyName} ${field.comment}
  68. </#list>
  69. */
  70. public ${valueObjectName}(<#list valueObjectFields as field>${field.propertyType} ${field.propertyName}<#if field_has_next>, </#if></#list>) {
  71. // TODO: 实现值对象构造逻辑,包括参数验证
  72. <#list valueObjectFields as field>
  73. this.${field.propertyName} = ${field.propertyName};
  74. </#list>
  75. }
  76. ## ---------- BEGIN Getter 方法 ----------
  77. <#list valueObjectFields as field>
  78. /**
  79. * <p>获取${field.comment}</p>
  80. *
  81. * @return ${field.propertyType} ${field.comment}
  82. */
  83. public ${field.propertyType} get${field.propertyName?substring(0,1)?upper_case}${field.propertyName?substring(1)}() {
  84. return ${field.propertyName};
  85. }
  86. </#list>
  87. ## ---------- END Getter 方法 ----------
  88. /**
  89. * <p>值相等性比较</p>
  90. *
  91. * <p>值对象通过属性值比较相等性,而非引用比较。</p>
  92. *
  93. * @param obj 比较对象
  94. * @return boolean 是否相等
  95. */
  96. @Override
  97. public boolean equals(Object obj) {
  98. if (this == obj) {
  99. return true;
  100. }
  101. if (obj == null || getClass() != obj.getClass()) {
  102. return false;
  103. }
  104. ${valueObjectName} that = (${valueObjectName}) obj;
  105. // TODO: 实现属性值比较逻辑
  106. <#list valueObjectFields as field>
  107. <#if field.propertyType == "String">
  108. if (${field.propertyName} != null ? !${field.propertyName}.equals(that.${field.propertyName}) : that.${field.propertyName} != null) {
  109. return false;
  110. }
  111. <#else>
  112. if (${field.propertyName} != that.${field.propertyName}) {
  113. return false;
  114. }
  115. </#if>
  116. </#list>
  117. return true;
  118. }
  119. /**
  120. * <p>计算哈希值</p>
  121. *
  122. * <p>值对象的哈希值基于所有属性值计算。</p>
  123. *
  124. * @return int 哈希值
  125. */
  126. @Override
  127. public int hashCode() {
  128. // TODO: 实现哈希值计算逻辑
  129. int result = 17;
  130. <#list valueObjectFields as field>
  131. <#if field.propertyType == "String">
  132. result = 31 * result + (${field.propertyName} != null ? ${field.propertyName}.hashCode() : 0);
  133. <#else>
  134. result = 31 * result + (int) (${field.propertyName} ^ (${field.propertyName} >>> 32));
  135. </#if>
  136. </#list>
  137. return result;
  138. }
  139. /**
  140. * <p>转换为字符串</p>
  141. *
  142. * @return String 字符串表示
  143. */
  144. @Override
  145. public String toString() {
  146. return "${valueObjectName}{" +
  147. <#list valueObjectFields as field>
  148. "${field.propertyName}=" + ${field.propertyName} +
  149. <#if field_has_next> ", " + </#if>
  150. </#list>
  151. '}';
  152. }
  153. }