Мне нужна помощь с использованием перечислений, чтобы эта программа работала - PullRequest
0 голосов
/ 10 мая 2018

Так что я впервые спрашиваю о 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, это было бы здорово! Спасибо.

1 Ответ

0 голосов
/ 10 мая 2018

An 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 в качестве объекта сделает ваш код быстрее, проще для чтения и легче рассуждать. Теперь, когда вы увидели другой подход, используйте его, когда это уместно.

...