Недавно я получил это задание в моем начальном классе информатики:
Напишите программу, которая просит пользователя ввести месяц (1 = январь, 2 = февраль и т. Д.), А затем печатает количество дней в месяце. Для февраля выведите «28 дней». Введите месяц (1–12): 5 31 день. Реализуйте класс Month с помощью метода int getDays (). Не используйте отдельный оператор if или else для каждого месяца. Используйте логические операторы.
Я не прошу кого-то выполнить указанное задание, а скорее критикую мое собственное решение. Прежде чем спросить об этом, я провел базовый поиск, но в большинстве, если не во всех решениях, используется класс Calendar и таким образом вычисляется количество дней. Цель этого присвоения - передать идею условных операторов и логических операторов.
Мое решение: Season.java
/**
* @author Jared Holley
* Date: 4/01/14
* Period: 3rd
*
* Write a program that asks the user to enter a month (1 = January, 2 = February, and
* so on) and then prints the number of days of the month. For February, print
* “28 days”.
*
* With a method int getDays(). Do not use a separate if or else
* statement for each month. Use Boolean operators.
*/
//31: 1,3,5,7,8,10,12
//30: 2,4,6,9,11
public class Month {
private int month;
/**
* The constructor for the Month class.
* Simply takes in a monthNumber and sets it to the
* class variable.
* @param monthNumber
*/
public Month(int monthNumber){
month = monthNumber;
}
/**
* The method that converts a month number into the number of days within that month.
* It first checks if the month is February so that it eliminates that from the following conditions that would produce a false positive.
* It then goes through and uses a rather odd conditional statement.
* The first half of the if statements increments all the months by one and checks if they are even.
* This would turn January into 2 which does have 31 days and trun April into 5 which has 30 days.
* The second half just checks the even months beyond 7.
* Lastly it will just return 30 otherwise.
* @return The numbers of days within the month.
*/
public int getDays(){
if(month == 2)return 28;
if( ((month + 1) % 2 == 0 && month < 9) || ((month % 2 == 0) && month >= 8)) return 31;
return 30;
}
}
Решение работает нормально. Я просто хотел бы знать, есть ли более элегантный подход к делу. Мое условное утверждение выглядит очень некрасиво. Спасибо за помощь!
month
final. Кроме того,month % 2 != 0
может быть яснее, чем _3 _... - person assylias   schedule 03.04.2014month
final, если вы не хотите, чтобы этот класс был неизменным. И если вы сделаетеmonth
final, это должно бытьpublic final
, поскольку это примитив. - person Jared   schedule 03.04.2014getDays
метод будет намного лучшеreturn daysArray[month];
, но вы действительно не хотите тратить место и решили, чтоmonth
должен начинаться с индекса 0. Вы только что сломали весь код, который зависел наmonth
- это человеческое представление числа месяца. Использование частной переменной и методаgetMonthNumber
дает вам гибкость при изменении вашей реализации, если вы хотите, чтобы никто не заметил. - person assylias   schedule 03.04.2014final
, должен установить значение. - person Jared   schedule 03.04.2014month
полностью является ответственностью вызывающего класса за ее правильное использование. Цель объявления вещей частным, защищенным или на уровне пакета - это доверие. Предоставляя доступ к внутренней переменной, вы уверены, что вызывающий класс не может сделать ваш объект несогласованным. Но если этоfinal
(и примитивный или неизменяемый объект), то любой другой класс не может нарушить this объект. Но прямое чтение переменных всегда предпочтительнее, чем вызов метода. - person Jared   schedule 03.04.2014month
и BAM, у вас есть общедоступная переменная, которая вам не нужна. - person thobens   schedule 03.04.2014final
. Если у вас есть программа, в которой вы хотите перерабатывать объекты, вы должны быть очень осторожны, чтобы убедиться, что вы действительно можете сбросить объект на что-то новое, если хотите, иfinal
поля ограничивают ваши возможности для этого. И это очень реальная проблема в Java из-за сборки мусора (если вы создаете огромное количество временных объектов, это вызовет проблемы с производительностью) ... вот почему я хотел бы, чтобы в Java была конструкция для размещения объектов на куча. - person Jared   schedule 03.04.2014final
, но просто сделать их общедоступными, потому что вы определили их final, - это просто наполовину готово, учитывая, что вы не единственный, кто модифицирует или рефакторинг кода. - person thobens   schedule 03.04.2014