Java Groovy枚举中的计算值

Java Groovy枚举中的计算值,java,groovy,enums,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

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

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
,它表示所有非预定义值。也就是说,
自定义(日期a、日期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
    }

}
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.
  }
}
你认为最好的方式是什么?这个持续时间将是调用REST web服务的方法的一个输入参数,这就是为什么我试图将它定义为一个枚举,而不是仅仅传递一个字符串。

如果它是Java(我不是Groovy专家),我建议使用类似
ONE_HOUR(“1”+DurationUnits.duration_SUFFIX_HOUR)的方法,
或者最好使用另一个表示单元本身的枚举,例如:

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
    }

}
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.
  }
}
这在Groovy中也应该是可行的,并且允许在不需要解析字符串的情况下进行计算/比较

更新:

对于自定义持续时间(如果Java 8自己的
Duration
类不适合您的需要),您可以使用一些常量将
Duration
设置为一个普通(不可变)类:

class Duration {
  public static final Duration ONE_HOUR = new Duration(1, DurationUnit.HOUR );
  ...

  private final int quantity;
  private DurationUnit unit;

  //constructor and getters
}

您可以使用字符串附加

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);
不过,最好使用时间单位

ONE_HOUR(1, TimeUnit.HOUR),
ONE_DAY(1, TimeUnit.DAY),
ONE_WEEK(7, TimeUnit.DAY),
ONE_MONTH(30, TimeUnit.DAY);
注意:并非所有月份都有30天

您还可以使用一段时间

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

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

我如何表示自定义的持续时间?比方说,我需要一个15天的值(15是动态的,可以是3、8或200)。。。有没有办法用enum做到这一点?@sanzoan在这种情况下,我可能不会对
Duration
使用enum,而是使用一个自定义类以及一些常用值常量(基本上,enum是以这种方式实现的)。Java 8自己的
Duration
类就是一个例子(具有常量
ZERO
)。谢谢Thomas,我也认为这是最好的解决方案。我不确定带日期的示例是否只是一个说明性示例,或者实际上是您想要实现的。如果是这样,考虑使用时间类别:它当然可以帮助。