枚举:使用不同的值创建几个具有相同“类型”的枚举?

时间:2018-03-14 20:17:54

标签: java enums enumeration

我目前正在努力实现枚举类型。

我想要一个具有特定类型“星期一”,“星期二”,......“星期日”的枚举“日”。

现在我希望每天都有一个对象“任务”,并且可以有几个“星期一”或几个“星期日”包含不同的任务。

public enum Day{
        MONDAY(0),
        TUESDAY(1),
        WEDNESDAY(2),
        THURSDAY(3),
        FRIDAY(4);
        SATURDAY(5);
        SUNDAY(6);

        /* Number of day */
        int dayNumber;
        /* menus of the day*/
         Task task;

        /*
         * Initializes the day with given number
         */
        private Day(int dayNumber) {
            this.dayNumber = dayNumber;
            this.task = new Task();
        }


        public Task getTask () {
            return task;
        }

        public void setTask() {
            this.task = task;
        }
    }

如何创建几个星期一,星期二......等等,并为它们设置不同的任务?在我的实现中,我总是最终得到包含相同任务的几天。例如,我创建

Day day1 = Day.MONDAY;
Day day2 = Day.MONDAY;
Day day3 = Day.MONDAY;

day1.setTask(new Task(x));
day2.setTask(new Task(y));
day3.setTask(new Task(z));

现在我的程序中的实现导致所有三天(day1,day2和day3)包含用“z”初始化的任务,我不明白为什么。如何设置使用不同的值初始化相同类型的日期(在此示例中为“Day.MONDAY”)?

4 个答案:

答案 0 :(得分:2)

根据吉姆的评论,我认为他有权利。您可能想要做的是创建一个可以将Day类型绑定到Task的对象。

class Binding {
  Map<Day,List<Task>> bindings = new HashMap<>();

  public void add( Day day, Task task ) {
    List<Task> tasks = bindings.get( day );
    if( tasks == null ) {
       tasks = new ArrayList<>();
       bindings.put( day, tasks );
    }
    tasks.add( task );
  }
}

代码未经测试。

答案 1 :(得分:2)

应该很可能避免在Task枚举中Day耦合 具有可变状态可以在枚举中但是它将使其不易读并且不太可重复使用 您应该重新设计TaskDay之间的责任。

你有两种可能性。

分离日和任务

创建一个组成TaskDay枚举的类:

public class DayTask{

     private Day day;
     private Task task;
    ....
}

你可以写:

DayTask oneMondayTask = new DayTask(Day.MONDAY, new Task(...));
DayTask anotherMondayTask = new DayTask(Day.MONDAY, new Task(...));

此处DayTask之间的耦合仅位于组成它们的类中。
优点:DayTask可以单独使用 缺点:更多的代码和结构要操纵。

日常任务

此处Task取决于Day 优点:更少的代码和结构来操纵。
缺点:如果Task在任何情况下都不需要Day,则会比Task中的要求更多地承担责任/复杂性。

public class Task{

     private Day day;
    ....
}

你可以写:

Task oneMondayTask = new Task(Day.MONDAY);
Task anotherMondayTask = new Task(Day.MONDAY);

答案 2 :(得分:0)

您无法创建枚举文字的多个实例。

Enum实例由Java运行时创建,它们是 singleton 对象。

这意味着只有一个MONDAY对象。周期。

您需要通过更改撰写方向(让Task知道其到期日)或使用其他Date或{{1来重新设计代码类。

答案 3 :(得分:0)

所有3个变量day1day2day3都引用相同的枚举对象,因此当您调用setTask时,更改显示所有3个变量。

如果您需要不同的星期一,那么枚举不是正确的解决方案。使用不同的星期一实例创建Day类。

如果您在同一天需要多个任务,则在枚举定义中使用List<Task>而不是一个Task,以及将Task添加到列表中的实现。