如何为一个枚举设置值?

3

I have the following enum:

enum ColumnType {
    TEXT,
    NUMERIC,
    DATE
}

在使用这个enum时,如果使用DATE值,我需要能够指定日期格式String。我该怎么做?

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

foo(ColumnType.DATE("yyyyMMdd");

以后如果 ColumnTypeDATE,我需要使用 object.getColumnType.getDateFormat() 检索该值。这是否可能?

到目前为止,我能够找到的文档只提供了设置枚举值的方法,但它们都是针对所有枚举值的设置,而不是单个枚举值的设置。

我的枚举理解还比较基础,如果表述不准确,敬请谅解。谢谢!

编辑:

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


你不能这样做。枚举是单例的,而且在初始化后应该是不可变的。 - Andreas
你可以使用静态方法来编写这个,但是方法名称和实例名称相同会令人困惑。 - Peter Lawrey
你能分享一些使用枚举的示例代码吗?为什么日期格式需要成为枚举的一部分? - Mick Mnemonic
3个回答

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中拥有一些固定的、预先创建的类型,同时使用共同的接口创建额外的类型。


我对你最后的例子感到困惑。那段代码无法编译。 - Zephyr
@Zephyr 我以为你可以填写细节。我会让它编译通过的。 - Peter Lawrey

2
你可以实现两个构造函数并在必要时传递日期格式掩码,但是它不能在运行时更改:
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());

    }
}

你能否更新你的答案,展示如何调用构造函数并传入日期掩码? - Zephyr
1
DATE("yyyyMMdd") 调用构造函数。你不能在运行时调用它。 - Axifive
啊,它需要在运行时调用,因为用户可以选择日期格式... - Zephyr
1
@Zephyr,就像Peter Lawrey所回答的那样,您应该声明一个带有枚举类型和额外字段(如日期格式)的单独类。 - Axifive

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;
}

1
我已经更新了我的答案,为您提供了一个简单的解决方案,您可以动态地传递dateFormat。如果这对您有用,请告诉我。 - Pushpesh Kumar Rajwanshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接