gpt4 book ai didi

java - 如何使 Java 代码通用以处理不同类型的 POJOS 并向其中添加数据?

转载 作者:行者123 更新时间:2023-12-02 09:29:56 24 4
gpt4 key购买 nike

我有不同类型的客户 POJO。我有一个函数,它以字符串格式获取客户详细信息,并获取客户的类型。现在,通过这个函数,我想向其中添加一些信息,然后返回 JSON 字符串。我可以通过检查类型并反序列化为适当的对象并处理它来做到这一点。但我想找出某种重构方法,可以在不知道客户类型的情况下做到这一点。

以下是我的类(class):

@Value.Immutable
public interface Customer1 {

String firstName();

String phoneNumber();

@Value.Immutable
interface Address1 {
String addressLine();
}
}

========

@Value.Immutable
public interface Customer2 {

String firstName();

String lastName();

@Value.Immutable
interface Address2 {
String addressLine();

String addressLine2();
}
}

========

public enum CustomerType {
CUSTOMER1(Customer1.class, Customer1.Address1.class),
CUSTOMER2(Customer2.class, Customer2.Address2.class);

private final Class<?> type;

private final Optional<Class<?>> addressType;

CustomerType(final Class<?> type) {
this.type = type;
this.addressType = Optional.empty();
}

CustomerType(final Class<?> type, final Class<?> addressType) {
this.type = type;
this.addressType = Optional.of(addressType);
}

public Class<?> getType() {
return type;
}

public Optional<Class<?>> getAddressType() {
return addressType;
}
}

========

    private static final Gson GSON;

public String check(String customerType, String customerDetails, String addressDetails) {
// Write this function such that it doesn't have to do check on what is customer Type.

if (CustomerType.CUSTOMER1.name().equals(type)) {

Customer1.Address1 address1 = GSON.fromJson(addressDetails, Customer1.Address1.class);

Customer1 updatedCustomerDetails = ImmutableCustomer1.copyOf(GSON.fromJson(customerDetails, Customer1.class))
.withAddress1(address1);

return GSON.toJson(updatedCustomerDetails);
} else if (CustomerType.CUSTOMER2.name().equals(type)) {
/// Similar like above
} else {
return null;
}

有什么方法可以使用 CustomerType 库来概括我的检查功能吗?我已经准备好将我的代码重构到任何级别。可能我当前的客户模型是错误的,这使我不容易做到这一点。

最佳答案

首先,确定您正在处理的客户类型(即 CustomerType 的值)。有了这些,您就可以使用 switch 语句来确定处理(理想情况下,您可以将每种类型的处理移到单独的方法中)。重要的是,如果缺少任何 CustomerTypes,使用这样的 switch 语句可能会触发构建时错误 - 在构建时捕获该问题比稍后从晦涩的运行时错误报告中找出问题更好!

public String check(String customerType, String customerDetails, String addressDetails) 
{

try {
CustomerType customerType = CustomerType.valueOf(type);
} catch (IllegalArgumentException e) {
return null;
}

// Java12 - Use Switch Expressions
String result =
switch (customerType) {
case CUSTOMER1 -> formatCustomer1(customerDetails, addressDetails);
case CUSTOMER2 -> formatCustomer2(customerDetails, addressDetails);
// etc
}


// Up to Java 11 - Use normal Switch statement
String result = null;
switch (customerType) {
case CUSTOMER1: result = formatCustomer1(customerDetails, addressDetails);
break;
case CUSTOMER2: result = formatCustomer2(customerDetails, addressDetails);
break;
// etc
}

Java12 的 Switch 表达式有一些优点:

1)更清晰的语法(尤其是,没有“break”语句!)

2) 如果未处理所有枚举,则会出现编译时错误。

但是,即使是 Java12 之前的开关也有:

1) 如果缺少任何枚举值,您的 IDE 可能会警告您

2) 您可以使用自动化工具,如果缺少枚举值,该工具将引发构建时失败

您还可以更进一步,向 CustomerType 枚举本身添加方法来调用这些“格式”方法(尽管我个人认为这可能走得太远了)。

关于java - 如何使 Java 代码通用以处理不同类型的 POJOS 并向其中添加数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58071516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com