← Назад к вопросам

Приведи пример условного оператора

1.8 Middle🔥 111 комментариев
#Другое

Комментарии (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();
    }
}

Лучшие практики

  1. Guard clauses — проверяй ошибки в начале
  2. Избегай вложенности — максимум 2-3 уровня
  3. switch-expression вместо switch-statement
  4. Optional для работы с nullable значениями
  5. Именованные переменные — не совмещай условия
  6. Кидай исключения для невозможных состояний вместо else