枚举:创建多个具有不同值的相同 "type" 的枚举?

Enumeration: Creating several enums of same "type" with different values?

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

我想要一个具有特定类型 "Monday"、"Tuesday"、..."Sunday" 的枚举 "Day"。

现在我想在每一天都有一个对象 "task",并且能够有多个 "Mondays" 或多个 "Sundays" 包含不同的任务。

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));

现在我的程序中的上述实施结果在所有三天(第 1 天、第 2 天和第 3 天)都包含使用 "z" 初始化的任务,我不太明白为什么。我如何设法用不同的值初始化相同类型的天数(本例中的"Day.MONDAY")?

您不能为一个枚举文字创建多个实例。

枚举实例由 Java 运行时创建,它们是 单例 对象。

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

您将需要通过改变写作方向(让 Task 知道它的截止日期)或使用其他 DateDateTime 来重新设计您的代码类.

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

如果您需要不同的星期一,那么枚举不是合适的解决方案。创建具有不同星期一实例的 Day class。

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

基于 Jim 的评论,我认为他有权发表评论。您可能想要做的是制作一个可以将 Day 类型绑定到 Tasks.

的对象
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 );
  }
}

代码未经测试。

很可能应该避免在 Day 枚举中耦合 Task
具有可变状态在枚举中是可行的,但它会降低可读性和可重用性。
您可能应该重新设计 TaskDay 之间的职责。

你大致有两种可能性。

分离日和任务

创建一个由 TaskDay 枚举组成的 class :

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之间的耦合仅位于构成它们的class中。
优点:DayTask都可以单独使用。
缺点:要操作的代码和结构更多。

耦合日任务

这里Task依赖于一个Day.
优点:操作的代码和结构更少。
缺点:如果 Task 在任何情况下都不需要 Day,它会提供比 Task.

中要求的更多的 responsibilities/complexities
public class Task{

     private Day day;
    ....
}

你可以这么写:

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