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

Сколько знаешь способов проверки условий?

2.0 Middle🔥 111 комментариев
#Docker, Kubernetes и DevOps#JVM и управление памятью#ORM и Hibernate

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Способы проверки условий в Java

Проверка условий — фундаментальная часть программирования. В Java есть множество способов:

1. If-Else (классический контроль потока)

public class ConditionalChecks {
    public void checkAge(int age) {
        if (age < 0) {
            System.out.println("Age cannot be negative");
        } else if (age < 18) {
            System.out.println("Minor");
        } else if (age < 65) {
            System.out.println("Adult");
        } else {
            System.out.println("Senior");
        }
    }
}

Используй когда: простая логика ветвления

2. Switch-Case (для дискретных значений)

public class SwitchExample {
    public String getDayName(int day) {
        return switch (day) {
            case 1 -> "Monday";
            case 2 -> "Tuesday";
            case 3 -> "Wednesday";
            default -> "Unknown";
        };
    }
    
    // Старый синтаксис
    public void checkRole(String role) {
        switch (role) {
            case "admin":
                System.out.println("Full access");
                break;
            case "user":
                System.out.println("Limited access");
                break;
            default:
                System.out.println("Unknown role");
        }
    }
}

Используй когда: проверяешь одну переменную против множества значений

3. Ternary оператор (условное выражение)

public class TernaryExample {
    public static void main(String[] args) {
        int age = 20;
        String status = age >= 18 ? "Adult" : "Minor";
        System.out.println(status);
        
        // Вложенный ternary (избегай!)
        String message = age < 13 ? "Child" :
                        age < 18 ? "Teen" :
                        age < 65 ? "Adult" :
                        "Senior";
    }
}

Используй когда: простая двусторонняя проверка

4. Assertions (для отладки)

public class AssertionExample {
    public void divide(double a, double b) {
        assert b != 0 : "Divisor cannot be zero";
        double result = a / b;
        
        assert result > 0 : "Result should be positive";
        System.out.println("Result: " + result);
    }
}

Запуск с ассертами:

java -ea MyApp  # -ea включает ассерты

Используй когда: отладка внутренних инвариантов

5. try-catch (исключения)

public class ExceptionChecking {
    public void parseNumber(String input) {
        try {
            int number = Integer.parseInt(input);
            System.out.println("Parsed: " + number);
        } catch (NumberFormatException e) {
            System.err.println("Invalid number format: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("Unexpected error: " + e);
        }
    }
}

Используй когда: проверяешь исключительные ситуации

6. Optional (проверка null-safety)

import java.util.Optional;

public class OptionalExample {
    public void processUser(User user) {
        // Способ 1: if present
        Optional.ofNullable(user)
            .ifPresent(u -> System.out.println("User: " + u.getName()));
        
        // Способ 2: if present or else
        String name = Optional.ofNullable(user)
            .map(User::getName)
            .orElse("Unknown");
        System.out.println("Name: " + name);
        
        // Способ 3: filter
        Optional.ofNullable(user)
            .filter(u -> u.getAge() >= 18)
            .ifPresent(u -> System.out.println("Adult user"));
    }
}

Используй когда: работаешь с nullable значениями

7. Pattern Matching (Java 16+)

public class PatternMatching {
    public void checkObject(Object obj) {
        // Instanceof pattern
        if (obj instanceof String str) {
            System.out.println("String length: " + str.length());
        } else if (obj instanceof Integer num) {
            System.out.println("Number: " + num);
        }
    }
    
    // Switch with patterns (Java 17+)
    public String describe(Object obj) {
        return switch (obj) {
            case String s -> "String: " + s;
            case Integer i -> "Integer: " + i;
            case null -> "Null value";
            default -> "Unknown type";
        };
    }
}

Используй когда: работаешь с полиморфными типами

8. Guard Clauses (ранние выходы)

public class GuardClausesExample {
    public void processOrder(Order order) {
        // Вместо вложенных if
        if (order == null) {
            throw new IllegalArgumentException("Order cannot be null");
        }
        if (order.getItems().isEmpty()) {
            throw new IllegalArgumentException("Order must have items");
        }
        if (order.getTotal() <= 0) {
            throw new IllegalArgumentException("Order total must be positive");
        }
        
        // Основная логика
        saveOrder(order);
    }
}

Используй когда: нужна валидация на входе

9. Objects utility методы

import java.util.Objects;

public class ObjectsChecking {
    public void validateUser(User user) {
        // isNull / nonNull
        if (Objects.isNull(user)) {
            throw new NullPointerException("User is null");
        }
        
        // requireNonNull
        Objects.requireNonNull(user, "User must not be null");
        
        // equals с null-safety
        if (Objects.equals(user.getRole(), "admin")) {
            grantFullAccess(user);
        }
        
        // deepEquals для массивов
        if (Objects.deepEquals(user.getPermissions(), expectedPermissions)) {
            System.out.println("Permissions match");
        }
    }
}

Используй когда: нужны null-безопасные операции

10. Assertions в тестах (JUnit)

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class CalculatorTest {
    @Test
    void testAddition() {
        Calculator calc = new Calculator();
        
        // Различные assertions
        assertEquals(4, calc.add(2, 2));
        assertNotEquals(5, calc.add(2, 2));
        assertTrue(calc.add(1, 1) > 0);
        assertFalse(calc.add(-1, -1) > 0);
        assertNull(calc.divide(1, 0));
        assertNotNull(calc.add(1, 1));
        
        // Бросит исключение
        assertThrows(ArithmeticException.class, () -> calc.divide(1, 0));
        
        // Проверка коллекций
        assertIterableEquals(List.of(1, 2, 3), calc.getResults());
    }
}

Используй когда: пишешь юнит-тесты

11. Условное логирование

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ConditionalLogging {
    private static final Logger logger = LoggerFactory.getLogger(ConditionalLogging.class);
    
    public void processData(Data data) {
        if (logger.isDebugEnabled()) {
            logger.debug("Processing data: {}", data);
        }
        
        if (logger.isErrorEnabled()) {
            logger.error("Error occurred");
        }
    }
}

Используй когда: нужна условная отладка

12. Проверки через предусловия (Preconditions от Guava)

import com.google.common.base.Preconditions;

public class PreconditionsExample {
    public void setAge(int age) {
        Preconditions.checkArgument(age >= 0, "Age must be non-negative");
        Preconditions.checkArgument(age < 150, "Age seems unrealistic");
        this.age = age;
    }
    
    public void processUser(User user) {
        Preconditions.checkNotNull(user, "User cannot be null");
    }
}

Используй когда: нужна выразительная валидация параметров

Сравнение методов

┌─────────────────────┬──────────┬──────────────┬─────────────┐
│ Способ              │ Читаемо  │ Производит   │ Когда       │
├─────────────────────┼──────────┼──────────────┼─────────────┤
│ if-else             │ Да       │ Простой      │ Основное    │
│ switch              │ Да       │ Быстрый      │ Множество   │
│ ternary             │ Да       │ Компактный   │ Простое     │
│ Optional            │ Да       │ Функциональ  │ null-safety │
│ Pattern matching    │ Да       │ Современный  │ Типы        │
│ assertions          │ Да       │ Отладка      │ Тесты       │
│ try-catch           │ Да       │ Исключения   │ Ошибки      │
│ Guard clauses       │ Да       │ Ранний выход │ Валидация   │
└─────────────────────┴──────────┴──────────────┴─────────────┘

Best Practices

// ПЛОХО: глубокие вложения
if (user != null) {
    if (user.isActive()) {
        if (user.getAge() >= 18) {
            // логика
        }
    }
}

// ХОРОШО: guard clauses
if (user == null || !user.isActive() || user.getAge() < 18) {
    return;
}
// основная логика

// ПЛОХО: null checking везде
if (obj != null && obj.getValue() != null) {
    // ...
}

// ХОРОШО: Optional
Optional.ofNullable(obj)
    .map(Object::getValue)
    .ifPresent(this::process);

Ключевые выводы

  • if-else — основной инструмент для простых проверок
  • switch — для множества дискретных значений
  • Optional — для null-safety и функциональных цепочек
  • Pattern matching — современный способ работы с типами
  • Guard clauses — уменьшают вложенность
  • Assertions — для отладки и тестирования
  • try-catch — для исключительных ситуаций
  • Выбирай инструмент в зависимости от контекста — это показывает опыт
Сколько знаешь способов проверки условий? | PrepBro