2012-10-31 15 views
5

私はこれをしようとしています。私は平日のenumを持っています。平日はクラスを列挙型の中にネストし、列挙型の中にarraylistを作成できますか?

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

一定であると私はSessionというクラスを、持っているので、私はenumを使用しています。セッションは単に特定の時間に何が起こっているかということです。数学クラス

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と呼ばれる第3のクラスがあります。開催地はセッションをホストします。数学のクラスでは、私がする必要がどのような

「数学のクラス」(例)と呼ばれる会場で、午前9時から午前10時まで
public class Venue { // simply a place that can hold several sessions in a day 
    private String name; 
    private int capacity; 

    /** several methods**/ 
} 

することができ、このです - 列挙IEのセッションのリストを作成し、毎日持っていますそのセッションでは、会場内の構造体(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. enumarraylistsを受け入れることができますか?
  3. 会場内のセッションで列挙型を保持するのに最適な構造は何ですか?
  4. これについてもっと良いアイデアですか?

誰かが、私がすべての会場に同じ日を過ぎていると言いました。 MONDAYはすべての会場で月曜日です。そのリストはすべての会場で更新されます。誰もコメントしていないのに、それは議論の終わりだと思う。

+1

はい。すべてに。セッションが変化するエンティティなので4を除く。月曜日は2つの物理学セッションを持つことができ、次の月に別の科目の2つの全く異なるセッションがあるので、この構造を全く使用することは賢明ではありません。 –

+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をクラスとして使用しようとしています。 Enumは常にAtomic(状態を持たない)でなければなりません。私は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; 
    ... 
}