枚举:创建多个具有不同值的相同 "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
知道它的截止日期)或使用其他 Date
或 DateTime
来重新设计您的代码类.
所有 3 个变量 day1
、day2
和 day3
都引用 相同的 枚举对象,因此当您调用 setTask
,所有 3 个变量都会显示变化。
如果您需要不同的星期一,那么枚举不是合适的解决方案。创建具有不同星期一实例的 Day
class。
如果您需要在同一天执行多个任务,则在枚举定义中使用 List<Task>
而不是一个 Task
,以及将 Task
添加到列表。
基于 Jim 的评论,我认为他有权发表评论。您可能想要做的是制作一个可以将 Day
类型绑定到 Task
s.
的对象
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
。
具有可变状态在枚举中是可行的,但它会降低可读性和可重用性。
您可能应该重新设计 Task
和 Day
之间的职责。
你大致有两种可能性。
分离日和任务
创建一个由 Task
和 Day
枚举组成的 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(...));
此处Day
和Task
之间的耦合仅位于构成它们的class中。
优点:Day
和Task
都可以单独使用。
缺点:要操作的代码和结构更多。
耦合日任务
这里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);
我目前正在努力实现枚举类型。
我想要一个具有特定类型 "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
知道它的截止日期)或使用其他 Date
或 DateTime
来重新设计您的代码类.
所有 3 个变量 day1
、day2
和 day3
都引用 相同的 枚举对象,因此当您调用 setTask
,所有 3 个变量都会显示变化。
如果您需要不同的星期一,那么枚举不是合适的解决方案。创建具有不同星期一实例的 Day
class。
如果您需要在同一天执行多个任务,则在枚举定义中使用 List<Task>
而不是一个 Task
,以及将 Task
添加到列表。
基于 Jim 的评论,我认为他有权发表评论。您可能想要做的是制作一个可以将 Day
类型绑定到 Task
s.
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
。
具有可变状态在枚举中是可行的,但它会降低可读性和可重用性。
您可能应该重新设计 Task
和 Day
之间的职责。
你大致有两种可能性。
分离日和任务
创建一个由 Task
和 Day
枚举组成的 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(...));
此处Day
和Task
之间的耦合仅位于构成它们的class中。
优点:Day
和Task
都可以单独使用。
缺点:要操作的代码和结构更多。
耦合日任务
这里Task
依赖于一个Day
.
优点:操作的代码和结构更少。
缺点:如果 Task
在任何情况下都不需要 Day
,它会提供比 Task
.
public class Task{
private Day day;
....
}
你可以这么写:
Task oneMondayTask = new Task(Day.MONDAY);
Task anotherMondayTask = new Task(Day.MONDAY);