Java: Получение названия месяца из целого числа
Вопрос: Как можно упростить этот метод, уменьшив его цикломатическую сложность и избегая использования switch-case?
Я столкнулся с проблемой избыточности и цикломатической сложности в методе, который преобразует номер месяца в строковое представление. В текущей реализации я использую конструкцию switch-case, что делает код громоздким и менее читаемым.
Вот фрагмент кода, который мне нужно упростить:
String monthString;
switch (month) {
case 1: monthString = "January"; break;
case 2: monthString = "February"; break;
case 3: monthString = "March"; break;
case 4: monthString = "April"; break;
case 5: monthString = "May"; break;
case 6: monthString = "June"; break;
case 7: monthString = "July"; break;
case 8: monthString = "August"; break;
case 9: monthString = "September"; break;
case 10: monthString = "October"; break;
case 11: monthString = "November"; break;
case 12: monthString = "December"; break;
default: monthString = "Invalid month"; break;
}
System.out.println(monthString);
Я ищу более элегантный способ реализации этого метода, который позволит избежать использования switch-case. Буду благодарен за ваши рекомендации и примеры кода!
5 ответ(ов)
Попробуйте следующее:
import java.text.DateFormatSymbols;
monthString = new DateFormatSymbols().getMonths()[month - 1];
В качестве альтернативы вы можете использовать SimpleDateFormat
:
import java.text.SimpleDateFormat;
System.out.println(new SimpleDateFormat("MMMM").format(date));
(Для второго варианта вам нужно будет создать объект Date
, содержащий ваш месяц).
Если у вас есть массив с названиями месяцев, например:
String[] str = {"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"};
И вы хотите получить название месяца по индексу, вы можете использовать следующий код:
if (i < str.length && i > 0) {
monthString = str[i - 1];
} else {
monthString = "Недействительный месяц";
}
Обратите внимание, что мы добавили проверку на то, что i
должно быть больше 0, чтобы избежать неправильного доступа к массиву. Если i
меньше 1 или больше количества месяцев в массиве, программа вернет сообщение "Недействительный месяц". Таким образом, вы сможете безопасно получать название месяцев из массива.
Вы можете создать массив строк и получать доступ к элементам по индексу следующим образом:
String months[] = {"Январь", "Февраль", "Март", "Апрель",
"Май", "Июнь", "Июль", "Август", "Сентябрь",
"Октябрь", "Ноябрь", "Декабрь"};
В этом коде определён массив months
, содержащий названия месяцев на русском языке. Для доступа к конкретному месяцу вы можете использовать индекс, например, months[0]
вернёт "Январь", а months[11]
вернёт "Декабрь". Помните, что индексация начинается с нуля!
Уже упоминалось об этом, но вот один из способов разместить код внутри метода:
public static String getMonthName(int monthIndex) {
return new DateFormatSymbols().getMonths()[monthIndex].toString();
}
Если же вы хотите создать более информативную ошибку вместо ArrayIndexOutOfBoundsException
, можно использовать следующий код:
public static String getMonthName(int monthIndex) {
// Поскольку индексация начинается с нуля, 11 = Декабрь
if (monthIndex < 0 || monthIndex > 11) {
throw new IllegalArgumentException(monthIndex + " не является допустимым индексом месяца.");
}
return new DateFormatSymbols().getMonths()[monthIndex].toString();
}
Таким образом, вы сможете обрабатывать ошибки более корректно и информативно.
Ваш код содержит несколько ошибок. В Java класс Month
не имеет метода of
, который вызывается как new Month.of(12)
. Вместо этого вы можете использовать статический метод Month.of(int month)
для создания объекта Month
. Вот исправленный пример кода:
import java.time.Month;
Month example = Month.of(12);
//--- Возвращает объект Month со значением декабря ---
String month = example.toString();
//--- Если вы хотите конвертировать Month в String ---
Теперь ваш код правильно создает объект Month
, представляющий декабрь, и затем преобразует его в строку.
Сортировка ArrayList пользовательских объектов по свойству
Как получить текущую дату и время в UTC или GMT в Java?
Java 8 – Создание Instant из LocalDateTime с учетом часового пояса
Как получить сегодняшнюю дату?
Android: Как получить дату за 7 дней назад (одна неделя)?