0

Java: Получение названия месяца из целого числа

11

Вопрос: Как можно упростить этот метод, уменьшив его цикломатическую сложность и избегая использования 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 ответ(ов)

1

Попробуйте следующее:

import java.text.DateFormatSymbols;
monthString = new DateFormatSymbols().getMonths()[month - 1];

В качестве альтернативы вы можете использовать SimpleDateFormat:

import java.text.SimpleDateFormat;
System.out.println(new SimpleDateFormat("MMMM").format(date));

(Для второго варианта вам нужно будет создать объект Date, содержащий ваш месяц).

0

Если у вас есть массив с названиями месяцев, например:

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

0

Вы можете создать массив строк и получать доступ к элементам по индексу следующим образом:

String months[] = {"Январь", "Февраль", "Март", "Апрель",
                   "Май", "Июнь", "Июль", "Август", "Сентябрь",
                   "Октябрь", "Ноябрь", "Декабрь"};

В этом коде определён массив months, содержащий названия месяцев на русском языке. Для доступа к конкретному месяцу вы можете использовать индекс, например, months[0] вернёт "Январь", а months[11] вернёт "Декабрь". Помните, что индексация начинается с нуля!

0

Уже упоминалось об этом, но вот один из способов разместить код внутри метода:

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();
}

Таким образом, вы сможете обрабатывать ошибки более корректно и информативно.

0

Ваш код содержит несколько ошибок. В 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, представляющий декабрь, и затем преобразует его в строку.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь