【问题标题】:Can i nest classes within enums, and create arraylist within an enum?我可以在枚举中嵌套类,并在枚举中创建数组列表吗?
【发布时间】:2023-03-06 10:49:01
【问题描述】:

我正在尝试这样做。我有一个工作日的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,因为会话是不同的实体。周一可以有两节物理课,下周一会有两节完全不同的另一门课,所以使用这种结构是不明智的。
  • 你的问题解决了吗?

标签: java class enums


【解决方案1】:

1) 是的,你可以。

2) 枚举可以拥有普通类所拥有的一切。唯一的区别是它具有固定数量的对象(例如,您的工作日有星期一、星期二等)。所以,你可以有类似的东西

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

3) 它总是视情况而定。您可以使用EnumSet 来保存您的工作日

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;
    ...
}

【讨论】:

    【解决方案2】:

    如果你给你的工作日枚举添加太多,你应该考虑一个超类或接口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;
        }
    }
    

    但正如我所说,尽量避免让您的枚举不仅仅是枚举。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 2022-11-09
      • 1970-01-01
      相关资源
      最近更新 更多