首页 > 解决方案 > 我需要帮助使用枚举来使该程序正常工作

问题描述

所以这是我第一次询问stackoverflow,但我需要帮助解决这个问题。我必须使用包含构造函数、方法和静态方法的枚举。

所以主要的一切都已经写好了,剩下的我写了,但我现在迷路了。

问题是解决这个写了一半的代码并得到输出。输出假设如下所示:

Today's a weekday. 
The abbreviation for MONDAY is M
The abbreviation for MONDAY is T
The abbreviation for MONDAY is W
The abbreviation for MONDAY is R
The abbreviation for MONDAY is F
The abbreviation for MONDAY is S
The abbreviation for MONDAY is Y
SUNDAY
MONDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY
true
true
true
true

到目前为止我的代码:

import java.util.List;

public class DayOfWeekDriver
{
    public enum DayOfWeek{
        MONDAY("M"), TUESDAY("T"), WEDNESDAY("W"), THURSDAY("R"), FRIDAY("F"), SATURDAY("S"), SUNDAY("S");

        static{
            MONDAY.next = TUESDAY;
            TUESDAY.next = WEDNESDAY;
            WEDNESDAY.next = THURSDAY;
            THURSDAY.next = FRIDAY;
            FRIDAY.next = SATURDAY;
            SATURDAY.next = SUNDAY;
            SUNDAY.next = MONDAY;
        }

        private DayOfWeek next;

        public DayOfWeek nextDay(){
            return next;
        }

        private String abbreviation;

        private String day;

        DayOfWeek(String abbreviation) {
            this.abbreviation = abbreviation;
        }
        public String getAbbreviation() {
            return abbreviation;
        }  

        public String getDays(){
            return day;
        }  
    }

    public char getLetter(){

    }



    public static void main(String[] args)
    {
        DayOfWeek today = DayOfWeek.FRIDAY;

        if (today == DayOfWeek.SATURDAY ||  today == DayOfWeek.SUNDAY)
        {
           System.out.println("Today's a weekend.");
        }
        else
        {
            System.out.println("Today's a weekday.");
        }

        for (DayOfWeek day : DayOfWeek.values())
        {
           System.out.printf("The abbreviation for %s is %c \n",
                             day, day.getLetter());
        }

        for (Character c : "YMWFTRS".toCharArray())
        {
            System.out.println(DayOfWeek.toDayOfWeek(c));
        }

        List<DayOfWeek> list = DayOfWeek.getDays();

        System.out.println(list.get(0) == DayOfWeek.values()[0]);

        System.out.println(DayOfWeek.MONDAY.next() == DayOfWeek.TUESDAY);

        System.out.println(today.next() == DayOfWeek.SATURDAY);

        System.out.println(DayOfWeek.SUNDAY.next() == DayOfWeek.MONDAY);

    }
}

而且,如果我能得到建议,在哪里学习更多关于 java 的知识,那就太好了!谢谢你。

标签: javaenumsstatic-methodsdayofweek

解决方案


Anenum是一种特殊的类。把它写成一个独立的类。它使程序的其余部分更易于维护、阅读和推理。由于枚举中的元素是常量,因此请使用所有大写名称以获得最大的可读性。

public enum Day {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY;
};

现在您有了一个课程,您想添加一个功能,即“单字母”日表示。您可以通过添加属性来为类执行此操作。 Enums既是常量又是类,因此我们将enum通过利用它的类类特性将“单字母”日表示添加到 中。

public enum Day {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY;

    private String shortName;

    public String getShortName() {
        return shortName;
    }
};

但是,我们如何设置shortName呢?答案是,既然enum是类,我们就使用构造函数。 enum构造函数存在,但它们受到约束。它们必须是private为了防止构造新实例(枚举的一个特性)。

public enum Day {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY;

    private String shortName;

    private Day(String abbreviation) {
       shortName = abbreviation;
    }

    public String getShortName() {
        return shortName;
    }
};

这就引出了最后一个问题,我们如何声明要传递给构造函数的值。好吧,你在声明静态值时就这样做了,就像这样

public enum Day {
    SUNDAY("S"),
    MONDAY("M"),
    TUESDAY("T"),
    WEDNESDAY("W"),
    THURSDAY("R"),
    FRIDAY("F"),
    SATURDAY("Y");

    private String shortName;

    private Day(String abbreviation) {
       shortName = abbreviation;
    }

    public String getShortName() {
        return shortName;
    }
};

这将“单字母”表示置于它所表示的事物中,从而提供良好的代码局部性和易于维护。

在您的代码中使用它

 if ( day == Day.MONDAY ) { // Typical enum comparison

 System.out.println(day.getShortName()); // prints the day's short name

学习 Java 时,很难从良好的面向对象开始。您的问题基本上是“如何向枚举添加内容”之一,但是因为您使用了嵌入到另一个类中的枚举,所以它在错误的类中得到了解决。你开始编程“我怎样才能让这门课给我那个枚举的正确答案”。不要那样编程,如果你能避免的话。而是编写您的代码,以便“其他对象”为您提供答案。

enum在 Java 中是另一种语言的想法的一个端口。Java 在使它enum看起来像 C 的枚举和使其表现得像 Java 语言的集成组件方面做得很好。也就是说,人们最初会接触到 C 的枚举语法,这意味着他们会接触到 C 的枚举维护问题。因此,对于学习 Java 和 Java 枚举的人来说,您的方法是可以理解的。也就是说,将enum用作对象将使您的代码更快、更易于阅读和更易于推理。既然您已经看到了不同的方法,请在适当的时候使用它。


推荐阅读