Java枚举

Java枚举,java,enums,Java,Enums,这就是我想做的: 创建一个包含枚举的应用程序,该枚举表示一周中的天数。显示日期列表,然后提示用户输入日期。显示所选日期的营业时间。假设周日营业时间为11点至5点,平日营业时间为9点至9点,周六营业时间为9点至6点 这就是我所拥有的: import javax.swing.JOptionPane; public class DayOfWeek { Day day; public void Day(Day day) { this.day = day; } public void bu

这就是我想做的:

创建一个包含枚举的应用程序,该枚举表示一周中的天数。显示日期列表,然后提示用户输入日期。显示所选日期的营业时间。假设周日营业时间为11点至5点,平日营业时间为9点至9点,周六营业时间为9点至6点

这就是我所拥有的:

import javax.swing.JOptionPane;


public class DayOfWeek {
Day day;

public void Day(Day day) {
    this.day = day;
}

public void businessHours() {
    switch (day) {
        case SATURDAY: System.out.println("Open from 9 to 6.");
                     break;

        case SUNDAY: System.out.println("Open from 11 to 5.");
                     break;

        default:     System.out.println("Open from 9 to 9.");
                     break;
    }
}

public static void main(String[] args) {

    String dayInput = JOptionPane.showInputDialog("Please input a day: ");

    EnumDay sixthDay = new EnumDay(Day.SATURDAY);
    sixthDay.businessHours();
    EnumDay seventhDay = new EnumDay(Day.SUNDAY);
    seventhDay.businessHours();

    if (dayInput == "Saturday")
    {
    JOptionPane.showMessageDialog(null, sixthDay.businessHours());
    System.exit(0);
    }

    else if (dayInput == "Sunday")
    {
        JOptionPane.showMessageDialog(null, seventhDay.businessHours());
        System.exit(0);
    }
    else
    {
        JOptionPane.showMessageDialog(null, default.businessHours());
        System.exit(0);
    }
}
}
和枚举类:

public enum Day {

SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
THURSDAY, FRIDAY, SATURDAY 

}

请帮助我如何进行比较和打印。谢谢。

您可以这样保存数据:

Class WorkingDay{
  Day day;
  Time startTime;
  Time endTime;

  public WorkingDay(Day day, Time startTime, Time endTime){
    this.day = day;
    this.startTime = startTime;
    this.endTime = endTime;
  }   

 //getters/setters 
 ...

}

class Time{
   int hours;
   int minutes;
   public Time(int hours, int minutes){
     ...
   }

   public String toString(){
       return hours + " : " + minutes; 
   }

  //getters/setters 
  ...

}
public enum Day {
    SUNDAY("Sunday", "Open from 11 to 5."),
    MONDAY("Monday", "Open from 9 to 9."),
    TUESDAY("Tuesday", "Open from 9 to 9."),
    WEDNESDAY("Wednesday", "Open from 9 to 9."),
    THURSDAY("Thursday", "Open from 9 to 9."),
    FRIDAY("Monday", "Open from 9 to 9."),
    SATURDAY("Saturday", "Open from 9 to 6.");

    private final String day;
    private final String openingHours;

    Day(String day, String openingHours) {
        this.day = day;
        this.openingHours = openingHours;
    }

    public String getDay() {
        return day;
    }

    public String getOpeningHours() {
        return openingHours;
    }
}
和使用:

WorkingDay monday =  new WorkingDay (Day.MONDAY, new Time(9, 0), new Time(21,0));
...
WorkingDay saturday=  new WorkingDay (Day.SATURDAY, new Time(9, 0), new Time(18,0));
...

WorkingDay workingDay = ...;
System.out.println("Open from " + workingDay.getStartTime() +  " to " + workingDay.getEndTime());

)

您可以通过以下方式获得
枚举值的
字符串
表示形式:

for (Day d : Day.values())
{
   System.out.println(d);
}
这将帮助您打印天数列表

从用户获得(字符串)输入后,可以使用以下方法将其映射回枚举:

Day userInputDay = Day.valueOf(userInputString);

现在您有了正确的枚举值,您的
开关
语句将发挥作用。

如果您这样创建枚举:

Class WorkingDay{
  Day day;
  Time startTime;
  Time endTime;

  public WorkingDay(Day day, Time startTime, Time endTime){
    this.day = day;
    this.startTime = startTime;
    this.endTime = endTime;
  }   

 //getters/setters 
 ...

}

class Time{
   int hours;
   int minutes;
   public Time(int hours, int minutes){
     ...
   }

   public String toString(){
       return hours + " : " + minutes; 
   }

  //getters/setters 
  ...

}
public enum Day {
    SUNDAY("Sunday", "Open from 11 to 5."),
    MONDAY("Monday", "Open from 9 to 9."),
    TUESDAY("Tuesday", "Open from 9 to 9."),
    WEDNESDAY("Wednesday", "Open from 9 to 9."),
    THURSDAY("Thursday", "Open from 9 to 9."),
    FRIDAY("Monday", "Open from 9 to 9."),
    SATURDAY("Saturday", "Open from 9 to 6.");

    private final String day;
    private final String openingHours;

    Day(String day, String openingHours) {
        this.day = day;
        this.openingHours = openingHours;
    }

    public String getDay() {
        return day;
    }

    public String getOpeningHours() {
        return openingHours;
    }
}
您可以获得请求的日期,如:

Day day = null;

for (Day d : Day.values()) {
    if (d.getDay().equals(dayInput)) {
        day = d;
        break;
    }
}
然后就

if (day != null)
    System.out.println(day.getOpeningHours());
根据Sergey的回答: 您可以向enum添加字段,因为enum被编译为内置java类enum的子类

enum WorkingDay{ MON("Monday", 9, 9), TUE... SUN("Sunday", 11,5);
       String name;
       int start;
       int end;
       //add private ctor

       public static WorkingDay forString(String dayName) {
             for(WorkingDay d : values())
                 if(d.name.equals(dayName))
                      return d;
       }
}
当然,若你们需要在工作时间内工作,就要使用日历。 通过这种方式,您可以:

 WorkingDay day = WorkingDays.forString(dayInput);
 System.out.println("Open from: " + day.start + " to:" + day.end);

看这里,这几乎就是你正在做的


您已经在与switch语句进行比较,它还应该进行输出。if-else语句是不必要的,因为您正在使用switch语句进行检查。认真查看链接中的代码……

您有一个bug。而不是

dayInput == "Sunday"
您应该使用
equals
方法

"Sunday".equals(dayInput)
因为这实际上比较的是字符串相等,而不是引用相等。 有关更多详细信息,请参阅

或者,您可以使用以下工具:

Day day = Day.valueOf(dayInput.toUpperCase(Locale.ENGLISH))

我将把它作为一个练习留给读者,让他们找出
“Friday.toUpperCase()
“Friday.toUpperCase”(Locale.ENGLISH)
的不同之处

我宁愿这样做:

public enum Day {
    MONDAY(new Time(9, Time.AM), new Time(6, Time.PM)),
    // ... rest of weekdays here
    SATURDAY(new Time(9, Time.AM), new Time(6, Time.PM)),
    SUNDAY(new Time(11, Time.AM), new Time(5, Time.PM));

    private final Time open;
    private final Time close;

    private Day(Time open, Time close) {
        this.open = open;
        this.close = close;
    }

    public String businessHours() {
        return "Open from " + open.toString() + " to " + close.toString() + ".";
    }

    @Override public String toString() {
        return name().substring(0, 1) + name().substring(1).toLowerCase();
    }
}
主要方法:

public static void main(String[] args) {
    final String dayInput = JOptionPane.showInputDialog("Please input a day: ");
    try {
        final Day actualDay = Day.valueOf(dayInput.toUpperCase()); // I don't know swing at all, it could be null pointer access here
    } catch(IllegalArgumentException e) {
        // for example print dialog with error about wrong day name
    }
    System.exit(0);
}

时间类可以通过toString()方法实现,但您可以简单地添加分钟数、比较等(或者您可以使用普通整数而不是创建时间类,但它非常不可扩展)。

什么是
EnumDay
以及为什么要创建它?如果您想走这条路,不需要
工作日
课程。Java中的
enum
是一个“特殊”类,您可以对其进行扩展以包含此功能(“扩展”因为没有更好的术语-您可以向
enum
中添加方法和私有字段)。编辑:flesk的回答很好地说明了这一点。@BrianRoach,当我们在enum类中添加字段时,我们有预定义的实例(星期一(Time1,Time2)…)。当我们从外部设置时间参数时,我们的代码更加灵活。这对于DTO来说是很好的,但是为什么要这样做,除非您使用数据库进行持久化,而这里不是这样?