Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Условные операторы в Java: полное руководство
Условные операторы позволяют выполнять разные блоки кода в зависимости от условия. Это один из фундаментов программирования. Покажу все основные варианты и практические примеры.
1. Простой if-else
Базовая структура:
public class PaymentProcessor {
public void processPayment(Payment payment) {
// Простое условие
if (payment.getAmount() > 0) {
System.out.println("Обработка платежа на сумму: " + payment.getAmount());
} else {
System.out.println("Ошибка: некорректная сумма");
}
}
}
2. if-else if-else цепочка
Множество условий:
public class UserStatusValidator {
public void validateUserStatus(User user) {
int accountAge = calculateAccountAge(user);
if (accountAge < 7) {
user.setStatus("NEW");
} else if (accountAge < 30) {
user.setStatus("ACTIVE");
} else if (accountAge < 365) {
user.setStatus("LOYAL");
} else {
user.setStatus("VIP");
}
}
}
3. Вложенные if
Проверка нескольких условий:
public class OrderValidation {
public boolean validateOrder(Order order) {
// Вложенные условия
if (order != null) {
if (order.getItems() != null && !order.getItems().isEmpty()) {
if (order.getTotalAmount() > 0) {
if (order.getCustomer() != null) {
return true; // Заказ валидный
}
}
}
}
return false;
}
}
Лучше использовать операторы ввода (guard clauses):
public boolean validateOrder(Order order) {
// Guard clauses — проверяем ошибки первыми
if (order == null) return false;
if (order.getItems() == null || order.getItems().isEmpty()) return false;
if (order.getTotalAmount() <= 0) return false;
if (order.getCustomer() == null) return false;
return true; // Чище и понятнее
}
4. Тернарный оператор
Компактная форма if-else для простых случаев:
public class DiscountCalculator {
public double calculateDiscount(Customer customer, Order order) {
// Классический if-else
if (customer.isVip()) {
return order.getTotalAmount() * 0.20; // 20% скидка
} else {
return order.getTotalAmount() * 0.05; // 5% скидка
}
}
// Тернарный оператор — более компактно
public double calculateDiscountShort(Customer customer, Order order) {
return customer.isVip() ?
order.getTotalAmount() * 0.20 :
order.getTotalAmount() * 0.05;
}
// Вложенные тернарные операторы (избегай!)
public String getShippingMethod(Customer customer, Order order) {
return customer.isVip() ?
"EXPRESS" :
customer.isPremium() ?
"STANDARD" :
"ECONOMY";
}
}
5. Switch-case
Множество случаев для одной переменной:
public class OrderStatusHandler {
public void handleOrderStatus(Order order, String status) {
switch (status) {
case "PENDING":
order.setStatus("PROCESSING");
notificationService.sendToMerchant(order);
break;
case "PROCESSING":
order.setStatus("SHIPPED");
notificationService.sendToCustomer(order);
break;
case "SHIPPED":
order.setStatus("DELIVERED");
order.setDeliveredAt(LocalDateTime.now());
break;
case "DELIVERED":
// Завершение заказа
break;
default:
throw new IllegalArgumentException("Неизвестный статус: " + status);
}
}
}
6. Switch-expression (Java 14+)
Современный синтаксис, возвращает значение:
public class UserRolePermissions {
public int getMaxUploadSize(String userRole) {
// Новый синтаксис с -> и явным return
return switch (userRole) {
case "ADMIN" -> 1000; // 1000 MB
case "PREMIUM" -> 500; // 500 MB
case "USER" -> 100; // 100 MB
case "GUEST" -> 10; // 10 MB
default -> throw new IllegalArgumentException(
"Unknown role: " + userRole
);
};
}
public String getPermissionDescription(UserRole role) {
return switch (role) {
case ADMIN -> "Полный доступ к системе";
case MODERATOR -> "Модерирование контента";
case USER -> "Чтение и создание контента";
case GUEST -> "Только чтение";
};
}
}
7. Логические операторы (AND, OR, NOT)
Комбинирование условий:
public class AccessControl {
public boolean canAccessResource(User user, Resource resource) {
// AND (&&) — все условия должны быть истинны
if (user != null && user.isActive() && user.hasPermission(resource)) {
return true;
}
return false;
}
public boolean hasEditAccess(User user, Document doc) {
// OR (||) — хотя бы одно условие истинно
return user.isAdmin() ||
user.getId().equals(doc.getAuthorId()) ||
user.hasRole("EDITOR");
}
public boolean isAccountLocked(User user) {
// NOT (!) — противоположное значение
return !user.isActive();
}
// Комбинирование
public boolean canDeleteComment(User author, Comment comment, User currentUser) {
boolean isOwner = currentUser.getId().equals(comment.getAuthorId());
boolean isAdmin = currentUser.isAdmin();
boolean isRecent = comment.getCreatedAt().isAfter(
LocalDateTime.now().minusHours(1)
);
return (isOwner || isAdmin) && isRecent;
}
}
8. Optional (Java 8+ — функциональный подход)
Работа с null-значениями:
public class UserService {
private final UserRepository userRepository;
// Старый способ с null-проверками
public String getOldWay(String userId) {
User user = userRepository.findById(userId);
if (user != null) {
Profile profile = user.getProfile();
if (profile != null) {
return profile.getDisplayName();
}
}
return "Unknown User";
}
// Новый способ с Optional
public String getModernWay(String userId) {
return userRepository.findById(userId)
.map(User::getProfile)
.map(Profile::getDisplayName)
.orElse("Unknown User");
}
// Альтернатива
public void processUser(String userId) {
userRepository.findById(userId)
.ifPresent(user -> {
user.setLastAccessTime(LocalDateTime.now());
userRepository.save(user);
})
.ifPresentOrElse(
user -> log.info("User found: {}", user.getId()),
() -> log.warn("User not found: {}", userId)
);
}
}
9. Сравнение объектов
Правильное сравнение:
public class ComparisonExamples {
public void compare(String name, int age, User user) {
// Сравнение строк (!!)
// ❌ НЕПРАВИЛЬНО
if (name == "John") { } // Сравнивает ссылки!
// ✅ ПРАВИЛЬНО
if (name.equals("John")) { }
if (name.equalsIgnoreCase("john")) { } // Игнорируя регистр
// Сравнение чисел
if (age > 18 && age < 65) {
System.out.println("Трудоспособный возраст");
}
// Сравнение объектов
if (user instanceof Customer) {
Customer customer = (Customer) user;
System.out.println("Лояльность: " + customer.getLoyaltyPoints());
}
// Java 16+ Pattern Matching
if (user instanceof Customer customer) {
System.out.println("Лояльность: " + customer.getLoyaltyPoints());
}
}
}
10. Практический пример: Валидация формы
public class RegistrationValidator {
public ValidationResult validateRegistration(RegistrationRequest request) {
// Проверяем условия пошагово
if (request == null) {
return ValidationResult.error("Данные не предоставлены");
}
if (request.getEmail() == null || request.getEmail().isEmpty()) {
return ValidationResult.error("Email обязателен");
}
if (!request.getEmail().contains("@")) {
return ValidationResult.error("Некорректный формат email");
}
if (request.getPassword() == null || request.getPassword().length() < 8) {
return ValidationResult.error("Пароль должен быть минимум 8 символов");
}
if (!request.getPassword().matches(".*[A-Z].*")) {
return ValidationResult.error("Пароль должен содержать заглавную букву");
}
if (!request.getPassword().matches(".*[0-9].*")) {
return ValidationResult.error("Пароль должен содержать цифру");
}
// Все проверки прошли
return ValidationResult.success();
}
}
Лучшие практики
- Guard clauses — проверяй ошибки в начале
- Избегай вложенности — максимум 2-3 уровня
- switch-expression вместо switch-statement
- Optional для работы с nullable значениями
- Именованные переменные — не совмещай условия
- Кидай исключения для невозможных состояний вместо else