[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-java-11-25-evolyutsiya-null-safety-v-java":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},422,"evolyutsiya-null-safety-v-java",11,"java-11-25","Java 11–25","🆕","Эволюция null-safety в Java","Java не имеет встроенной null-safety на уровне типов (в отличие от Kotlin `?`), но постепенно добавляет инструменты: `Optional` (Java 8+), Helpful NPE (Java 14+), null в Pattern Matching (Java 21+), аннотации `@Nullable`\u002F`@NonNull`.\n\n### Optional — эволюция API по версиям\n\n| Версия | Новый API | Описание |\n|--------|-----------|----------|\n| Java 8 | `Optional.of\u002FofNullable\u002Fempty` | Базовый Optional |\n| Java 9 | `ifPresentOrElse()`, `or()`, `stream()` | Расширенный API |\n| Java 10 | `orElseThrow()` без аргументов | Замена `get()` |\n| Java 11 | `isEmpty()` | Инверсия `isPresent()` |\n| Java 21 | Pattern Matching + null в switch | Альтернативный подход к null |\n\n\u003Cdetails>\u003Csummary>Пример: эволюция Optional и null handling\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Java 8 — базовый Optional\nOptional\u003CString> name = Optional.ofNullable(user.getName());\nString result = name.orElse(\"Unknown\");\n\n\u002F\u002F Java 9 — ifPresentOrElse, or\noptional.ifPresentOrElse(\n    value -> process(value),\n    () -> handleAbsence()\n);\nOptional\u003CString> fallback = primary.or(() -> secondary);\n\n\u002F\u002F Java 10 — orElseThrow() без аргументов\nString value = optional.orElseThrow(); \u002F\u002F вместо optional.get()\n\n\u002F\u002F Java 11 — Optional.isEmpty()\nif (optional.isEmpty()) { ... } \u002F\u002F вместо !optional.isPresent()\n\n\u002F\u002F Java 21+ — Pattern Matching с null:\nswitch (value) {\n    case null -> handleNull();\n    case String s -> process(s);\n    default -> other();\n}\n```\n\n\u003C\u002Fdetails>\n\n### Helpful NullPointerException (Java 14+)\n\n```java\nvar street = user.getAddress().getCity().toUpperCase();\n\u002F\u002F До Java 14: NullPointerException (непонятно, что null)\n\u002F\u002F Java 14+:   Cannot invoke \"City.toUpperCase()\" because\n\u002F\u002F             the return value of \"Address.getCity()\" is null\n```\n\n### Аннотации @Nullable \u002F @NonNull\n\n```java\nimport org.springframework.lang.NonNull;\nimport org.springframework.lang.Nullable;\n\n@NonNull\npublic User findById(@NonNull Long id) {\n    return userRepository.findById(id)\n        .orElseThrow(() -> new NotFoundException(\"User not found: \" + id));\n}\n\n@Nullable\npublic User findByEmail(@NonNull String email) {\n    return userRepository.findByEmail(email).orElse(null);\n}\n```\n\n### Частые ошибки\n\n- Optional как параметр метода — anti-pattern; используйте перегрузку методов или `@Nullable`\n- Optional как поле класса — Optional не Serializable; используйте `@Nullable` для полей\n- `optional.get()` без проверки — может бросить `NoSuchElementException`; используйте `orElseThrow()`, `orElse()`, `ifPresent()`\n- Игнорировать `@Nullable` аннотации — IDE подсвечивает потенциальные NPE; не игнорируйте warnings\n\n### Как используется в 2026\n\n- `Optional` — стандарт для возвращаемых значений (особенно в repository\u002Fservice слоях)\n- `@Nullable`\u002F`@NonNull` аннотации — best practice; Spring использует `@NonNullApi` для всего пакета\n- JSpecify (`org.jspecify`) — новый стандарт null-safety аннотаций, набирает популярность\n- Pattern Matching + null handling в switch — удобная обработка nullable значений\n\n> **На собеседовании:** покажите, что знаете правила использования Optional (возвращаемые значения — да, параметры и поля — нет), Helpful NPE для отладки, и аннотации для статического анализа. Частая ошибка — вызывать `optional.get()` без проверки вместо `orElseThrow()`.","","middle",[15],"java-modern",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Эволюция null-safety в Java — Gymterview","Java не имеет встроенной null-safety на уровне типов (в отличие от Kotlin `?`), но постепенно добавляет инструменты: `Optional` (Java 8+), Helpful NPE (Java 14+","Java не имеет встроенной null-safety на уровне типов (в отличие от Kotlin `?`), но постепенно добавляет инструменты: `Op",[15,13],"Java не имеет встроенной null-safety на уровне типов (в отличие от Kotlin `?`), но постепенно добавляет инструменты: `Optional` (Java 8+), Helpful NPE (Java 14+), null в Pattern Matching (Java 21+), аннотации `@Nullable`\u002F`@NonNull`.",true]