2012-10-31 97 views
5

我正在嘗試這樣做。我有一個工作日的enum。我已經使用enum因爲平日裏是不變的我可以在枚舉中嵌套類,並在枚舉中創建ArrayList?

public enum WeekDay { 
    MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY; 
} 

,我有一類,稱爲Session。會話就是在特定時間發生的事情,例如,一個數學課

public class Session { 
    // some fields 
    public String title; 
    public int duration,start,end; 

    /** several methods follow to get and set, and check e.t.c **/ 
} 

有第三類,稱爲Venue。會場舉辦會議,例如在數學課可以從上午9點到上午10點,在一個叫「數學類」(例子)會場

public class Venue { // simply a place that can hold several sessions in a day 
    private String name; 
    private int capacity; 

    /** several methods**/ 
} 

我需要做的就是這一點 - 創建枚舉即每一天都有會話列表它的會話,然後我需要在一個場地內舉行一個結構(ArrayList或enumset?)的枚舉,即場地從週一到週五(最好是學校班)進行會話。因此,這將是這樣的:

public enum WeekDay { 
    MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY; 

    /** the list of sessions for a given day**/ 
    private ArrayList <Session> list; 
    private int numOfSessions; // number of sessions 

    /** with some methods like **/ 
    addSession(); 
    removeSession(); 
    getSession(); 
    checkTimeOfSession(); 
    ... 
} 

所以,在會場,我們可以有:

public class Venue { 
    private String name; 
    private int capacity; 
    private ? <WeekDay> list; //structure to hold days, i don't know which one to use yet 

    /** several methods like **/ 
    numOfSessionsOn(); 
    getSessionsOn(); 
    addSessionOn(); 
    removeSessionOn(); 
    ... 
} 

這裏是我的問題:

  1. 我可以巢Session類在enum
  2. Can enum接受arraylists
  3. 什麼是在會場內舉辦會議的最佳結構?
  4. 對此有什麼更好的想法?

有人告訴我,我會在同一天通過所有場地,例如,星期一是所有場地的星期一,其名單將由每個場地更新。所以我認爲即使沒有人評論,討論結束了。

+1

是的。對所有人。因爲會話是不同的實體,所以除4。星期一可以有兩次物理會議,下一個星期一會有另一個主題的兩個完全不同的會話,所以使用這個結構根本不明智。 –

+0

你解決了你的問題嗎? –

回答

1

如果你添加太多到你的工作日枚舉,你應該考慮一個超類或接口Weekday和實施每個工作日在他自己的班級。

如果你真的想這樣做,在你的枚舉,你可以做,在此方面:

1)實施的方法,每個方法(和構造做一個開關),如:

switch (this) { 
case MONDAY: 
    return ... 
    break; 

default: 
    break; 
} 

2)使該方法抽象,添加一個匿名的實施,每個工作日:

public enum weekday { 
    MONDAY { 
     @Override 
     public Object getSomething() { 
      // TODO Auto-generated method stub 
      return null; 
     } 
    }; 
    public abstract Object getSomething(); 
} 

3)添加的參數的構造函數:

public enum weekday { 
    MONDAY(new Object()); 
    final private Object object; 
    private weekday(Object object) { 
     this.object = object; 
    } 
} 

但正如我所說的,儘量避免讓你的枚舉多於枚舉。

+0

謝謝..我會試試看 – Obby

2

1)是的,你可以。

2)枚舉可以擁有普通類所具有的所有功能。唯一的區別是它有固定數量的對象(例如,您的WeekDay有MONDAY,TUESDAY等)。所以,你可以有類似的東西

public enum WeekDay { 
    MONDAY, ..., FRIDAY; 
    private final List<Session> sessions; 
    private WeekDay { 
     this.sessions = new ArrayList<Session>(); 
    } 
} 

3)它總是取決於案件。你可以使用EnumSet來節省你的星期幾

4)你正在嘗試使用你的Enum作爲一個類。枚舉應始終是原子的(不具有狀態)。我會讓WeekDay成爲一個簡單的枚舉,並且會構造類似於我所發佈的結構的波紋管:

public enum WeekDay { 
    MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY; 
} 
// Session have a topic and a duration 
public class Session { 
    private final String topic; 
    private final Duration duration; 
    public Session(String title, Duration duration) { 
     ... 
    } 
    // getter/setters 
} 
/** 
/* Venue is nothing more than an specialization of Session. So for example 
/* A venue is a session of math hat starts at 3pm. 
/*/ 
public class Venue { 
    private Session session; 
    private Time startTime; 
    ... 
} 
/** 
* Class that manages the venues that happens in a WeekDay. It can control 
* that will not add two Venus that happens at same period of time. 
*/ 
public class WeekDaySchedule { 
    private WeekDay weekDay; 
    private Set<Venue> venues; 
    ... 
} 
/** 
* Controls the whole week. 
*/ 
public class WeekSchedule { 
    private Collection<WeekDaySchedule> weekDaySchedules; 
    ... 
}