2013-07-24 173 views
1

我各有一個枚舉的月,季,和halfyear如何使一個枚舉項目具有另一個枚舉的項目?

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)。我怎樣才能實現這個?或者這可以重構?

+0

眼看'月/季度的代碼/ HalfYear'枚舉將有助於爲有幾個這樣的方式可以來達到的。 –

+0

除非你確實需要一個枚舉,否則我會去找一個可以處理這個函數的簡單類。一個類的優點是你可以將枚舉賦給一個私有變量,併爲你的'getIntervalByMonth(int month)'方法檢查這個變量 – bas

+0

@AdrianJandl不,我想返回一個枚舉'Month'或'Quarter來自Enum'TimeIntervalUnit'項目的''或'HalfYear'。 –

回答

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 
} 
+0

非常感謝!有趣的是,在你回答之前,我想到了這一點。我想你使用了思想傳輸技術或什麼的。 –

相關問題