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.