Groovy枚举中的计算值

时间:2016-01-26 12:08:39

标签: java groovy enums

我需要创建一个具有一些预定义值的枚举或类,并且必须有一个选项来计算其他值。假设我们有这个枚举:

enum Duration {

    ONE_HOUR("1${DurationUnits.DURATION_SUFFIX_HOUR}"),
    ONE_DAY("24${DurationUnits.DURATION_SUFFIX_HOUR}"),
    ONE_WEEK("7${DurationUnits.DURATION_SUFFIX_DAY}"),
    ONE_MONTH("30${DurationUnits.DURATION_SUFFIX_DAY}")

    String duration

    Environment(String duration) {
        this.duration = duration
    }

    static String custom(Date startTime, Date endTime) {
        // TODO Calculate difference in days between the two dates  
    }

    private static class DurationUnits {
        public static final String DURATION_SUFFIX_HOUR = "h"
        public static final String DURATION_SUFFIX_DAY = "d"
    }

}

所以我的问题是我是否可以定义一个枚举值,比如CUSTOM,它表示所有非预定义值的值。也就是说,custom(Date a, Date b)方法的通用值。 我无法弄清楚如何去做,实际上我认为它甚至不可能。

作为替代方案,我想创建一个类而不是枚举,如下所示:

class Duration {

    private static final String DURATION_SUFFIX_HOUR = "h"
    private static final String DURATION_SUFFIX_DAY = "d"

    /** Predefined values */

    static final String ONE_HOUR = "1${DURATION_SUFFIX_HOUR}"
    static final String ONE_DAY = "24${DURATION_SUFFIX_HOUR}"
    static final String ONE_WEEK = "7${DURATION_SUFFIX_DAY}"
    static final String ONE_MONTH = "30${DURATION_SUFFIX_DAY}"

    static String custom(Date startDate, Date endDate) {
        // TODO Calculate difference in days between the two dates
    }

}

您认为最好的方法是什么?此持续时间将是调用REST Web服务的方法的输入参数,这就是我尝试将其定义为枚举而不是仅传递字符串的原因。

2 个答案:

答案 0 :(得分:5)

您可以使用String append。

ONE_HOUR("1" + DurationUnits.DURATION_SUFFIX_HOUR),
ONE_DAY("24" + DurationUnits.DURATION_SUFFIX_HOUR),
ONE_WEEK("7" + DurationUnits.DURATION_SUFFIX_DAY),
ONE_MONTH("30" + DurationUnits.DURATION_SUFFIX_DAY);

然而,使用TimeUnits

可能更好
ONE_HOUR(1, TimeUnit.HOUR),
ONE_DAY(1, TimeUnit.DAY),
ONE_WEEK(7, TimeUnit.DAY),
ONE_MONTH(30, TimeUnit.DAY);

注意:并非所有月份都有30天。

您也可以在一段时间内使用Duration

Duration ONE_HOUR = Duration.ofHours(1);
Duration ONE_DAY = Duration.ofDays(1);

这将允许您根据需要创建更多持续时间。

答案 1 :(得分:0)

如果是Java(我不是Groovy专家),我建议像EntityA ea = dao.find(1) // find is @Transactional, but transaction is closed after method exits ea.getLazyReference().getId() // here is get exception. lazyReference is a ManyToOne relation and so the foreight key is stored in EntityA side. 这样的东西,或者更好地使用代表单位本身的另一个枚举,例如像这样:

ONE_HOUR("1" + DurationUnits.DURATION_SUFFIX_HOUR),

这在Groovy中也应该可行,并且允许进行计算/比较而无需解析字符串。

<强>更新

对于自定义持续时间(如果Java 8自己的enum DurationUnit { HOUR ("k"), DAY( "d" ); private final String key; //constructor and getter } enum Duration { ONE_HOUR(1, DurationUnit.HOUR ), ... private final int quantity; private DurationUnit unit; //constructor and getters public String toString() { return quantity + unit.getKey(); //should return 1h, 24h, 1d etc. } } 类不适合您的需要),您可以使Duration成为具有一些常量的普通(不可变)类:

Duration