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

还有第三类,叫做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)枚​​举可以拥有普通类所拥有的一切。唯一的区别是它具有固定数量的对象(例如,您的工作日有星期一、星期二等)。所以,你可以有类似的东西

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

3) 它总是视情况而定。你可以使用EnumSet来保存你的 WeekDay

4)您正在尝试将您的枚举用作一个类。枚举应该始终是原子的(没有状态)。我会让 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 回答