5

私はこれをやろうとしています。平日がありenumます。enum平日は一定なので使っています

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 **/
}

と呼ばれる3番目のクラスがあり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または列挙型?)に列挙型を保持する必要があります。つまり、会場にはからのセッションがあります。月曜日から金曜日(理想的には学校のクラス)。したがって、次のようになります。

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. enum受け入れることができますarraylistsか?
  3. 会場内でのセッションで列挙型を保持するための最良の構造は何ですか?
  4. これについてもっと良いアイデアはありますか?

誰かが私に、たとえば月曜日がすべての会場の月曜日であるかどうかに関係なく、すべての会場に同じ日を渡すと言ったところです。そのリストはすべての会場で更新されます。誰もコメントしていませんが、これで議論は終わりだと思います。

4

2 に答える 2

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を使用してWeekDayを保存できます

4)列挙型をクラスとして使用しようとしています。列挙型は常に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;
    ...
}
于 2012-10-31T16:08:47.940 に答える
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;
    }
}

しかし、私が言ったように、列挙型を列挙型以上にすることは避けてください。

于 2012-10-31T15:26:50.537 に答える