如何为一个枚举设置值?

时间:2018-10-12 17:53:23

标签: java enums

我有以下enum

enum ColumnType {
    TEXT,
    NUMERIC,
    DATE
}

使用此enum时,如果使用String值,则需要能够指定日期格式DATE。我该怎么办?

例如,在我的代码中,我想使用类似于以下内容的方法来调用方法:

foo(ColumnType.DATE("yyyyMMdd");

稍后,如果object.getColumnType.getDateFormat()ColumnType,我将需要能够使用DATE检索该值。这有可能吗?

到目前为止,我已经找到的文档提出了设置枚举值的方法,但是它们都展示了如何为所有枚举值(而不是单个枚举值)设置它。

我对枚举的理解是非常基本的,因此,如果措辞不正确,我深表歉意。谢谢!

编辑:

日期格式需要在运行时设置,因为用户将选择/输入日期格式字符串。

3 个答案:

答案 0 :(得分:6)

你可以

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中有一些固定的,预先创建的类型,而且还可以通过一个公共界面动态地创建其他类型。

答案 1 :(得分:2)

您可以实现两个构造函数,并在必要时传递Date格式的掩码,但不能在运行时更改它:

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());

    }
}

答案 2 :(得分:0)

现在,因为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;
}