如何让enum项目包含另一个枚举项?

时间:2013-07-24 14:05:24

标签: java enums

我每月,每季度和半年都有一个枚举

public enum Month implements TimeInterval {

    // JAN,FEB,MAR... (all with params & constructors)

    // implementation not important
}

public enum Quarter implements TimeInterval {

    // Q1, Q2 ... (all with params & constructors)

    // implementation not important
}

public enum HalfYear implements TimeInterval {

    // HY1, HY2 (all with params & constructors)

    // implementation not important
}

以及一个函数getIntervalByMonth(int)的枚举,我不知道如何实现。

public enum TimeIntervalUnit {

    MONTH(/* params */),

    QUARTER(/* params */),

    HALF_YEAR(/* params */);


    public TimeInterval getIntervalByMonth(int month) {
        // !!! should return the correct TimeInterval, 
        // for example TimeIntervalUnit.QUARTER.getIntervalByMonth(1) 
        // should return Quarter.Q1
    }

    // some other methods
}

我经常循环TimeIntervalUnit.values(),在该循环中我想使用函数getIntervalByMonth(int)。我该如何实现呢?或者这可以重构吗?

1 个答案:

答案 0 :(得分:2)

我建议将方法boolean containsMonth(int month)添加到TimeInterval界面。这样您就可以实现TimeIntervalUnit,如下所示:

public enum TimeIntervalUnit {

    MONTH(Month.values()),

    QUARTER(Quarter.values()),

    HALF_YEAR(HalfYear.values());


    public TimeInterval getIntervalByMonth(int month) {
        for (TimeInterval value : values) {
            if (value.containsMonth(month)) {
                return value;
            }
        }
        return null;
    }

    private final TimeInterval[] values;

    private TimeIntervalUnit(TimeInterval[] values) {
        this.values = values;
    }

    // some other methods
}