如何消除 util class 上 2 个不同 class 的重复项
How to eliminate duplicates on util class for 2 different class
我声明了 2 个 classes,它们具有相同的成员但由于某些原因分开了。我实现了一个 util class 来将这 2 个 classes 转换为 1 个相同的 class,如下所示。
@Data
@Builder
public class VO1 {
private int id;
private String value1;
private String value2;
...
private String value20;
}
@Data
@Builder
public class VO2 {
private int id;
private String value1;
private String value2;
...
private String value20;
}
@Data
@Builder
public class DomainEntity {
private int id;
private String value1;
private String value2;
...
private String value15;
}
public class Converter {
public static DomainEntity fromVO1(VO1 vo1) {
return DomainEntity.builder.id(vo1.getId())
.value1(vo1.getValue1())
.value2(vo1.getValue2())
...
.value15(vo1.getValue15())
.build();
}
public static DomainEntity fromVO2(VO2 vo2) {
return DomainEntity.builder.id(vo2.getId())
.value1(vo2.getValue1())
.value2(vo2.getValue2())
...
.value15(vo2.getValue15())
.build();
}
}
现在我在 'Converter' 中有重复代码,我想消除它们。我当然知道我可以使用继承来删除它。但是我也想使用 'Lombok',因为那些 classes 有很多属性。使用继承使得使用 'Lombok' 更加混乱。有谁知道解决这种情况的优雅方法吗?
谢谢。
您需要为所有值创建一个带有 getter 的接口,然后两个值对象都应实现它。然后在 Converter 中,您可以在一种可重复使用两次的方法中使用对该接口的引用。
我用继承试过你的例子,我不觉得代码变得更乱了,我是不是漏掉了什么?
对于继承,您可以使用实验性的@SuperBuilder
package lombok;
@Getter
@Setter
@SuperBuilder
public class BaseVO {
private String s1;
private String s2;
private String s3;
private String s4;
private String s5;
private String s6;
private String s7;
private String s8;
private String s9;
}
package lombok;
@Getter
@Setter
@SuperBuilder
public class VO1 extends BaseVO{
private String vo1Specific;
}
package lombok;
@Getter
@Setter
@SuperBuilder
public class VO2 extends BaseVO {
private String vo2Specific;
}
package lombok;
@Builder
@ToString
public class DomainEntity {
private String s1;
private String s2;
private String s3;
private String s4;
private String s5;
private String s6;
private String s7;
private String s8;
private String s9;
private String specific;
}
package lombok;
import lombok.DomainEntity.DomainEntityBuilder;
public class Converter {
public static <T extends BaseVO> DomainEntity fromVO(T basevo) {
DomainEntityBuilder builder = DomainEntity.builder();
builder.s1(basevo.getS1()).s2(basevo.getS2()).s3(basevo.getS3());
if (basevo instanceof VO1) {
VO1 vo1 = (VO1) basevo;
builder.specific(vo1.getVo1Specific());
}
if (basevo instanceof VO2) {
VO2 vo1 = (VO2) basevo;
builder.specific(vo1.getVo2Specific());
}
return builder.build();
}
}
package lombok;
public class App {
public static void main(String[] args) {
VO1 vo1 = VO1.builder().s1("VO1S1").vo1Specific("VO1 specific property").build();
VO2 vo2 = VO2.builder().s1("VO2S1").vo2Specific("VO2 specific property").build();
DomainEntity d1 = Converter.<VO1>fromVO(vo1);
System.out.println(" d1 " + d1);
DomainEntity d2 = Converter.<VO2>fromVO(vo2);
System.out.println(" d2 " + d2);
}
}
我声明了 2 个 classes,它们具有相同的成员但由于某些原因分开了。我实现了一个 util class 来将这 2 个 classes 转换为 1 个相同的 class,如下所示。
@Data
@Builder
public class VO1 {
private int id;
private String value1;
private String value2;
...
private String value20;
}
@Data
@Builder
public class VO2 {
private int id;
private String value1;
private String value2;
...
private String value20;
}
@Data
@Builder
public class DomainEntity {
private int id;
private String value1;
private String value2;
...
private String value15;
}
public class Converter {
public static DomainEntity fromVO1(VO1 vo1) {
return DomainEntity.builder.id(vo1.getId())
.value1(vo1.getValue1())
.value2(vo1.getValue2())
...
.value15(vo1.getValue15())
.build();
}
public static DomainEntity fromVO2(VO2 vo2) {
return DomainEntity.builder.id(vo2.getId())
.value1(vo2.getValue1())
.value2(vo2.getValue2())
...
.value15(vo2.getValue15())
.build();
}
}
现在我在 'Converter' 中有重复代码,我想消除它们。我当然知道我可以使用继承来删除它。但是我也想使用 'Lombok',因为那些 classes 有很多属性。使用继承使得使用 'Lombok' 更加混乱。有谁知道解决这种情况的优雅方法吗?
谢谢。
您需要为所有值创建一个带有 getter 的接口,然后两个值对象都应实现它。然后在 Converter 中,您可以在一种可重复使用两次的方法中使用对该接口的引用。
我用继承试过你的例子,我不觉得代码变得更乱了,我是不是漏掉了什么?
对于继承,您可以使用实验性的@SuperBuilder
package lombok;
@Getter
@Setter
@SuperBuilder
public class BaseVO {
private String s1;
private String s2;
private String s3;
private String s4;
private String s5;
private String s6;
private String s7;
private String s8;
private String s9;
}
package lombok;
@Getter
@Setter
@SuperBuilder
public class VO1 extends BaseVO{
private String vo1Specific;
}
package lombok;
@Getter
@Setter
@SuperBuilder
public class VO2 extends BaseVO {
private String vo2Specific;
}
package lombok;
@Builder
@ToString
public class DomainEntity {
private String s1;
private String s2;
private String s3;
private String s4;
private String s5;
private String s6;
private String s7;
private String s8;
private String s9;
private String specific;
}
package lombok;
import lombok.DomainEntity.DomainEntityBuilder;
public class Converter {
public static <T extends BaseVO> DomainEntity fromVO(T basevo) {
DomainEntityBuilder builder = DomainEntity.builder();
builder.s1(basevo.getS1()).s2(basevo.getS2()).s3(basevo.getS3());
if (basevo instanceof VO1) {
VO1 vo1 = (VO1) basevo;
builder.specific(vo1.getVo1Specific());
}
if (basevo instanceof VO2) {
VO2 vo1 = (VO2) basevo;
builder.specific(vo1.getVo2Specific());
}
return builder.build();
}
}
package lombok;
public class App {
public static void main(String[] args) {
VO1 vo1 = VO1.builder().s1("VO1S1").vo1Specific("VO1 specific property").build();
VO2 vo2 = VO2.builder().s1("VO2S1").vo2Specific("VO2 specific property").build();
DomainEntity d1 = Converter.<VO1>fromVO(vo1);
System.out.println(" d1 " + d1);
DomainEntity d2 = Converter.<VO2>fromVO(vo2);
System.out.println(" d2 " + d2);
}
}