Как сделать код Java универсальным для обработки различных видов POJOS и добавления данных к этому? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть другой вид клиента POJO.И у меня есть функция, которая берет данные о клиенте в строковом формате и также принимает тип клиента.Теперь с помощью этой функции я хотел добавить к ней некоторую информацию и затем вернуть строку JSON.Я могу сделать это, проверив тип и десериализацию для соответствующих объектов и обработать это.Но я хотел найти способ рефакторинга, который может сделать это, не зная типа клиентов.

Ниже приведены мои занятия:

@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?Я готов провести рефакторинг своего кода на любом уровне.Возможно, моя текущая модель Customer неверна, что не позволяет мне сделать это легко.

1 Ответ

1 голос
/ 24 сентября 2019

Во-первых, определите, с каким типом клиента (т.е. с каким значением CustomerType) вы имеете дело.Имея это в виду, вы можете использовать оператор switch для определения обработки (и в идеале вы можете перенести обработку каждого типа в отдельный метод).Важно отметить, что использование такого оператора switch может затем вызвать ошибку времени сборки, если какие-либо CustomerTypes отсутствуют - лучше уловить эту проблему во время сборки, чем узнавать через некоторое время из неясного отчета об ошибке во время выполнения!

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 имеют несколько преимуществ:

1) Более чистый синтаксис (не в последнюю очередь, без операторов "break"!)

2) Ошибка времени компиляцииесли не все перечисления обрабатываются.

Однако, даже у переключателя, предшествующего Java12, есть:

1) Ваша среда IDE, вероятно, предупредит вас, если какие-либо значения перечисления отсутствуют

2) Вы можете использовать автоматизированные инструменты, которые будут запускать сбой во время сборки, если значения перечисления отсутствуют

Вы также можете пойти дальше и добавить методы в само перечисление CustomerType для вызова этих методов «форматирования».(хотя лично я думаю, что это может зайти слишком далеко).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...