Как вернуть в return разные типы данных?

Только начинаю изучать Java. Задача про кварталы года, столкнулся с проблемой: если вводить не валидные значения, что лучше всего возвращать? Хотел изначально вернуть "invalid data", но там тип int, поэтому решил вернуть просто 0. Как бы вы решили эту задачу с return Буду благодарен за советы :)

Код:

public static void main (String args[]){

    System.out.println(quarterOf(1));     // First quarter
    System.out.println(quarterOf(4));    // Second quarter
    System.out.println(quarterOf(7));    // Third quarter
    System.out.println(quarterOf(10));     // Fourth quarter
}

public static int quarterOf(int month) {
    if (month >0 && month <=3)
        return 1;
    else if(month >3 && month <=6)
        return 2;
    else if(month >6 && month <=9)
        return 3;
    else if(month >9 && month <=12)
        return 4;
    else
        return 0;
}

Ответы (1 шт):

Автор решения: KoVadim

Это типичная задача и для нее есть много решений в зависимости от того, что именно Вы решаете.

Классическое решение, которое взяли и Вы - сделать некоторое магическое значение, которое будет означать ошибку. А что бы оно не было таким магическим, это можно завернуть в константу (final:) ).

Второе хорошее решение - бросать исключение. Хорошая часть этого - ошибку сложно проигнорировать в отличии от магического значения. Но некоторые люди не любят исключения. Мне этот способ нравится, особенно, если это идет проверка пользовательского ввода, данных много и не хочется запутаться в сотнях if.

Следующий способ - возвращать не просто int (или что Вам нужно), а завернуть его в отдельный класс (или к примеру в Optional). Преимущество такого способа - теперь можно вернуть не просто "ошибка", а ( в случае своего класса) и некоторые детали ошибки. Я видел, как люди в Java делают свой class Int, у которого есть булевый признак "валиден". И потом его везде используют. И при попытке доступа к данным, когда они не установлены, можно просто бросать исключение. Кому исключения не нравятся - можно проверить валидность ручками. Я такой способ часто использую (правда не в java).

Если посмотреть на Go, то там очень похожая система. Только там с функции возвращается две переменные и одна с них результат, а другая признак успешности.

Ну и для особых случаев, когда все сильно запущенно, можно поступить по "ООП" - делаем базовый класс для результата и несколько наследников в зависимости от результата (ошибка - это тоже результат). У этого способа есть один большой минус - при неправильном подходе появляется куча мест, где происходит проверка типа. Вот этого нужно сильно-сильно избегать.

→ Ссылка