Реализация проверки продажи товара по времени и типу с условиями if-else

43. Проверить возможность продажи товара по времени и типу

Условие задачи:
Необходимо реализовать метод, который определяет возможность продажи товара в зависимости от времени и категории продукта.

Правила:

  • с 13:00 до 14:00 продажа любых товаров запрещена;

  • с 23:00 до 03:00 запрещена продажа любого алкоголя;

  • с 03:00 до 08:00 запрещена продажа алкоголя крепостью от 40 градусов;

  • в остальных случаях продажа разрешена.

Код:

public class IceCream implements Product {
}

public abstract class Alcohol implements Product {

    abstract int getAbv();
}

public boolean checkSale(Product item, Integer hour) {
    // код тут
}

Спойлеры к решению

Подсказки
💡 Сначала проверь входные данные.
💡 Обеденное время запрещает продажу любого товара.
💡 Ночной диапазон пересекает границу суток, поэтому используется ||.
💡 Проверять крепость нужно только для объектов типа Alcohol.
💡 Если ни один запрет не сработал, можно вернуть true.

Решение
public boolean checkSale(Product item, Integer hour) {
    if (item == null) {
        throw new IllegalArgumentException(
                "Product must not be null"
        );
    }

    if (hour == null || hour < 0 || hour > 23) {
        throw new IllegalArgumentException(
                "Invalid hour: " + hour
        );
    }

    // Обед: 13:00–13:59
    if (hour == 13) {
        return false;
    }

    // С 23:00 до 02:59 запрещена продажа любого алкоголя
    if (hour >= 23 || hour < 3) {
        if (item instanceof Alcohol) {
            return false;
        }
    }

    // С 03:00 до 07:59 запрещён крепкий алкоголь
    if (hour >= 3 && hour < 8) {
        if (item instanceof Alcohol) {
            Alcohol alcohol = (Alcohol) item;

            if (alcohol.getAbv() >= 40) {
                return false;
            }
        }
    }

    return true;
}

Поскольку метод принимает только целое значение часа, обеденный интервал интерпретируется как время с 13:00 до 13:59.

Ночной диапазон пересекает границу суток:

hour >= 23 || hour < 3

Поэтому здесь используется оператор ||.

Для обычных товаров ночные ограничения на алкоголь не применяются, и метод возвращает true.