Как установить значение для одного перечисления? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть следующее enum:

enum ColumnType {
    TEXT,
    NUMERIC,
    DATE
}

При использовании этого enum мне нужно иметь возможность указать формат даты String при использовании значения DATE.Как мне это сделать?

Например, в моем коде я хочу вызвать метод, используя что-то похожее на это:

foo(ColumnType.DATE("yyyyMMdd");

Позже мне нужно будет иметь возможность получить это значениеиспользуя object.getColumnType.getDateFormat(), если ColumnType равен DATE.Возможно ли это вообще?

В документации, которую я смог найти до сих пор, предлагаются способы установки значения перечисления, но все они показывают, как установить его для всех значений перечисления, а не для отдельного.

Мое понимание перечислений довольно простое, поэтому я прошу прощения, если это не правильно сформулировано.Спасибо!

РЕДАКТИРОВАТЬ:

Формат даты должен быть установлен во время выполнения, так как пользователь будет выбирать / вводить строку формата даты.

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Теперь, поскольку OP хочет только передавать dateFormat динамически, следовательно, следующий код подходит лучше,

public static void main(String[] args) {
    ColumnTypeValue columnTypeNumeric = new ColumnTypeValue(ColumnType.NUMERIC);
    ColumnTypeValue columnTypeText = new ColumnTypeValue(ColumnType.TEXT);
    ColumnTypeValue columnTypeDate = new ColumnTypeValue("yyyyMMdd");
}

public static class ColumnTypeValue {
    ColumnType columnType;
    String dateFormat;

    public ColumnTypeValue(ColumnType columnType) {
        this.columnType = columnType;
    }

    public ColumnTypeValue(String dateFormat) {
        this.columnType = ColumnType.DATE;
        this.dateFormat = dateFormat;
    }
}

enum ColumnType {
    TEXT, NUMERIC, DATE;
}
0 голосов
/ 12 октября 2018

Вы можете реализовать два конструктора и передать маску формата даты, если это необходимо, но ее нельзя изменить во время выполнения:

public enum ColumnType {
    TEXT,
    NUMERIC,
    DATE("yyyyMMdd");

    private final String dateMask;

    public String getDateMask() {
        return dateMask;
    }

    ColumnType(String dateMask) {
        this.dateMask = dateMask;
    }

    ColumnType() {
        this.dateMask = null;
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(ColumnType.DATE.getDateMask());

    }
}
0 голосов
/ 12 октября 2018

Вы можете сделать

enum ColumnType {
    TEXT,
    NUMERIC,
    DATE_YYYYMMDD,
    oher date format
}

Однако, если вам нужны произвольные форматы, вам нужен класс, чтобы обернуть их

class ColumnTypeFormat {
    ColumnType columnType;
    String format;
}

foo(new ColumnTypeFormat(ColumnType.DATE, "yyyyMMdd"));

Вы можете комбинировать их с общим интерфейсом

interface ColumnType {
    String getFormat();
    Class getType();
}

enum SimpleColumnType implements ColumnType {
    TEXT(String.class, "%s"),
    NUMERIC(BigDecimal .class, "%f");

    private Class type;
    private String format;

    SimpleColumnType(Class type, String format) {
        this.type = type;
        this.format = format;
    }

    @Override
    public Class getType() { return type; }

    @Override
    public String getFormat() { return format; }
}

class DateColumnType implements ColumnType {
    private final String format;

    public DateColumnType(String format) {
        this.format = format;
    }

    @Override
    public Class getType() { return LocalDate.class; }

    @Override
    public String getFormat() { return format; }
}

Это позволяет вам иметь некоторые фиксированные, предварительно созданные типы в enum, а также создавать дополнительные на лету с общим интерфейсом.

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