【问题标题】:I need help using enums to get this program working我需要帮助使用枚举来使该程序正常工作
【发布时间】:2018-05-10 06:17:56
【问题描述】:

所以这是我第一次询问 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 的知识,那就太好了!谢谢。

【问题讨论】:

  • 您的实际问题是什么?请在您的问题中添加问题陈述。
  • 问题是什么?
  • 问题是解决这个写了一半的代码并得到输出,输出应该是这样的。今天是工作日。 MONDAY 的缩写是 M MONDAY 的缩写是 T MONDAY 的缩写是 W MONDAY 的缩写是 R MONDAY 的缩写是 F MONDAY 的缩写是 S MONDAY 的缩写是 Y SUNDAY MONDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY true真真真假
  • 欢迎来到 Stack Overflow。是什么让你觉得你错过了什么?请更加明确和准确地说明缺少的内容,以便我们知道可以为您提供哪些帮助。
  • 请区分您被问到的问题和您向我们提出的问题。我想我到现在只能看到前者?也非常欢迎添加补充信息,请仅在问题中添加,以便我们将所有内容集中在一个地方,而不是在评论中。您的问题下方有一个edit 链接。

标签: java enums static-methods dayofweek


【解决方案1】:

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

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 作为对象将使您的代码更快、更容易阅读和更容易推理。既然您已经看到了不同的方法,请在适当的时候使用它。

【讨论】:

  • /** 访问这一天的缩写。 return char 单字母缩写 public char getLetter() / 按顺序访问天数列表。 **返回 List 天的列表。 */ public static List getDays()
  • /** 获取指定字母对应的日期。 ** param letter 一天的缩写。 ** 返回与给定字母匹配的 DayOfWeek。 / public static DayOfWeek toDayOfWeek(char letter) /* 获取这一天的下一天。 * @return DayOfWeek 以定义的顺序跟随这一天。 */ public DayOfWeek next()
  • 对间距感到抱歉,我该如何输入下一个句子,因为看起来真的很乱
  • @josephpark 不用担心。 cmets 的格式与其他内容不同。我习惯了用不好的间距阅读
  • @josephpark 您打算添加的扩展很简单,但为了清楚起见,这是第二个问题;在应用此问题中的更改后,请使用“几乎存在”的源代码作为第二个问题提出。 “我将如何返回这个枚举的列表?”这个问题的标题听起来不错。
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 2019-03-26
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多