Правильная реализация enum в java

150
22 марта 2019, 22:10

В учебных целях делаю приложение которое собирает строку (банковский счёт) из разных значений согласно этой таблице первые 3 символа счёта я беру из первого enum:

 public enum FirstPrimaryCode {
    DEBIT("408"),
    ACCUM("423"),
    CREDIT("454"),
    BANK("474");
    private final String code;
    FirstPrimaryCode(String code) {
        this.code = code;
    }
    public String getCode() {
        return code;
    }
}

Для 2ух последующих цифр кода мне пришлось сделать 4 разных enum, так как на разных типов счетов есть совпадающий код имеющий разные назначения.

public enum AccumSecondaryCode {
    ON_DEMAND("01"),
    UP_TO_ONE_YEAR("05"),
    UP_TO_THREE_YEARS("06"),
    MORE_THREE_YEARS("07");
    private final String code;
    AccumSecondaryCode(String code) {
        this.code = code;
    }
    public String getCode() {
        return code;
    }
}

public enum CreditSecondaryCode {
    UP_TO_ONE_YEAR("04"),
    UP_TO_THREE_YEARS("05"),
    MORE_THREE_YEARS("06");
    private final String code;
    CreditSecondaryCode(String code) {
        this.code = code;
    }
    public String getCode() {
        return code;
    }
}

В этих 2ух enam можно увидеть совпадающий код, которые принадлежит к разным назначениям счетов.

Подскажите как правильней реализовать данную операцию, конечно в моих масштабах достаточно и такой реализации, но всё-же хотелось бы разобраться в этом вопросе.

Answer 1

Мне кажется енамы тут немного неправильно применены. Мне в голову приходит примерная такая идея

class FirstPrimaryCode {
    public static Debit debit() {
        return new Debit("408");
    }
    public static Accum accum() {
        return new Accum("423");
    }
    // другие методы
}

class Debit {
    private StringBuilder code;
    public Debit(String code) {
        this.code = new StringBuilder(code);
    }
    public DebitSecondaryCode onDemand() {
        code.append("01");
        return new DebitSecondaryCode(code);
    }
    public DebitSecondaryCode upToOneYear() {
        code.append("05");
        return new DebitSecondaryCode(code);
    }
}
class Accum {
    private StringBuilder code;
    public Accum(String code) {
        this.code = new StringBuilder(code);
    }
    public AccumSecondaryCode upToOneYear() {
        code.append("04");
        return new AccumSecondaryCode(code);
    }
}

class DebitSecondaryCode {
    private StringBuilder code;
    public DebitSecondaryCode(StringBuilder code) {
        this.code = code;
    }
}
class AccumSecondaryCode {
    private StringBuilder code;
    public AccumSecondaryCode(StringBuilder code) {
        this.code = code;
    }
}

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

FirstPrimaryCode
    .debit()
    .onDemand()
    .thirdStep
    .fourthStep
    .get();

На последнем этапе должен возвращаться объект реализующий какой-то интерфейс Code, где будет реализован метод get. Поскольку каждый этап реализован в виде класса,то вызвать неправильный метод невозможно. Нельзя вызвать дважды debit() или acuum и потом onDemand и нельзя вручную его редактировать.
Может и не то что вам надо, но как вариант прошу рассмотреть

READ ALSO
Как правильно обрабатывать RuntimeException?

Как правильно обрабатывать RuntimeException?

Как правильно обрабатывать RuntimeException? Например, у меня есть следующий код:

145
зависимости тестов в TestNG

зависимости тестов в TestNG

Помогите пожалуйста установить зависимостиУ меня есть тесты:

177
EmptyStackException из ничего в Java

EmptyStackException из ничего в Java

появилась такая проблема в Java, есть метод FunctionCall:

130
как в процесcе создания нового пользователя извлечь сгенерированный id

как в процесcе создания нового пользователя извлечь сгенерированный id

Регистрирую в приложении нового пользователяЕму присваивается id

155