,-тегов — просто пишите Markdown." +- icon: "👁" + title: "Лучше в редакторах" + desc: "Markdown отлично отображается в современных IDE и текстовых редакторах." +support: + description: "Доступно с JDK 23 (сент. 2024)" diff --git a/translations/content/ru/language/module-import-declarations.yaml b/translations/content/ru/language/module-import-declarations.yaml new file mode 100644 index 0000000..3fcb33b --- /dev/null +++ b/translations/content/ru/language/module-import-declarations.yaml @@ -0,0 +1,17 @@ +title: "Объявления импорта модулей" +oldApproach: "Множество импортов" +modernApproach: "import module" +summary: "Импортировать все экспортируемые пакеты модуля одним объявлением." +explanation: "Объявления импорта модулей позволяют импортировать всё, что экспортирует модуль, одной строкой. Особенно полезно для java.base, который охватывает коллекции, ввод-вывод, потоки и многое другое." +whyModernWins: +- icon: "🧹" + title: "Одна строка" + desc: "Заменить стену импортов одним импортом модуля." +- icon: "📦" + title: "Осведомлённость о модульной системе" + desc: "Использует модульную систему для импорта связанных пакетов." +- icon: "🚀" + title: "Быстрый старт" + desc: "Идеально для скриптов и прототипов, где списки импортов утомительны." +support: + description: "Финализировано в JDK 25 LTS (JEP 511, сент. 2025)." diff --git a/translations/content/ru/language/pattern-matching-instanceof.yaml b/translations/content/ru/language/pattern-matching-instanceof.yaml new file mode 100644 index 0000000..d7321d6 --- /dev/null +++ b/translations/content/ru/language/pattern-matching-instanceof.yaml @@ -0,0 +1,17 @@ +title: "Pattern Matching для instanceof" +oldApproach: "instanceof + приведение типа" +modernApproach: "Переменная паттерна" +summary: "Совместить проверку типа и приведение в одном шаге с помощью pattern matching." +explanation: "Pattern matching для instanceof устраняет избыточное приведение после проверки типа. Переменная автоматически ограничена областью видимости, в которой паттерн совпадает, что делает код безопаснее и короче." +whyModernWins: +- icon: "🔄" + title: "Нет лишнего приведения" + desc: "Проверка типа и привязка переменной происходят в одном выражении." +- icon: "📏" + title: "Меньше строк" + desc: "Одна строка вместо двух — строка с приведением исчезает полностью." +- icon: "🛡️" + title: "Безопасность области видимости" + desc: "Переменная паттерна находится в области видимости только там, где тип гарантирован." +support: + description: "Доступно в JDK 16 (март 2021)" diff --git a/translations/content/ru/language/pattern-matching-switch.yaml b/translations/content/ru/language/pattern-matching-switch.yaml new file mode 100644 index 0000000..eb3d94e --- /dev/null +++ b/translations/content/ru/language/pattern-matching-switch.yaml @@ -0,0 +1,17 @@ +title: "Pattern Matching в switch" +oldApproach: "Цепочка if-else" +modernApproach: "Паттерны типов" +summary: "Заменить цепочки if-else-instanceof чистыми паттернами типов в switch." +explanation: "Pattern matching в switch позволяет напрямую сопоставлять типы, объединяя проверку типа, приведение и привязку в лаконичной метке case. Компилятор проверяет полноту охвата." +whyModernWins: +- icon: "📐" + title: "Структурированная диспетчеризация" + desc: "Switch делает структуру ветвления явной и понятной." +- icon: "🎯" + title: "Форма выражения" + desc: "Возвращает значение напрямую — изменяемая переменная не нужна." +- icon: "✅" + title: "Проверка исчерпываемости" + desc: "Компилятор обеспечивает обработку всех типов." +support: + description: "Доступно в JDK 21 LTS (сент. 2023)" diff --git a/translations/content/ru/language/primitive-types-in-patterns.yaml b/translations/content/ru/language/primitive-types-in-patterns.yaml new file mode 100644 index 0000000..7ac1d2b --- /dev/null +++ b/translations/content/ru/language/primitive-types-in-patterns.yaml @@ -0,0 +1,17 @@ +title: "Примитивные типы в паттернах" +oldApproach: "Ручные проверки диапазонов" +modernApproach: "Примитивные паттерны" +summary: "Pattern matching теперь работает и с примитивными типами, а не только с объектами." +explanation: "Java 25 расширяет pattern matching на примитивные типы. int, long, double и т.д. можно использовать в паттернах switch с охранниками when, что избавляет от боксинга и ручных проверок диапазонов." +whyModernWins: +- icon: "📦" + title: "Нет боксинга" + desc: "Сопоставлять примитивы напрямую — обёртка Integer не нужна." +- icon: "🎯" + title: "Единообразие паттернов" + desc: "Одинаковый синтаксис паттернов для объектов и примитивов." +- icon: "⚡" + title: "Лучшая производительность" + desc: "Избежать накладных расходов автобоксинга при pattern matching." +support: + description: "Предварительный просмотр в JDK 25 (третий превью, JEP 507). Требует --enable-preview." diff --git a/translations/content/ru/language/private-interface-methods.yaml b/translations/content/ru/language/private-interface-methods.yaml new file mode 100644 index 0000000..3bf286d --- /dev/null +++ b/translations/content/ru/language/private-interface-methods.yaml @@ -0,0 +1,17 @@ +title: "Приватные методы интерфейса" +oldApproach: "Дублированная логика" +modernApproach: "Приватные методы" +summary: "Выносить общую логику в интерфейсах в приватные методы." +explanation: "Java 9 позволяет использовать приватные методы в интерфейсах, что даёт возможность совместно использовать код между методами по умолчанию без раскрытия деталей реализации классам-реализаторам." +whyModernWins: +- icon: "🧩" + title: "Повторное использование кода" + desc: "Совместно использовать логику между методами по умолчанию без дублирования." +- icon: "🔐" + title: "Инкапсуляция" + desc: "Детали реализации остаются скрытыми от классов-реализаторов." +- icon: "🧹" + title: "DRY-интерфейсы" + desc: "Больше никакого копирования и вставки между методами по умолчанию." +support: + description: "Доступно в JDK 9 (сент. 2017)" diff --git a/translations/content/ru/language/record-patterns.yaml b/translations/content/ru/language/record-patterns.yaml new file mode 100644 index 0000000..f9c8b84 --- /dev/null +++ b/translations/content/ru/language/record-patterns.yaml @@ -0,0 +1,17 @@ +title: "Паттерны записей (деструктуризация)" +oldApproach: "Ручной доступ к полям" +modernApproach: "Деструктуризация" +summary: "Деструктурировать записи прямо в паттернах — извлекать поля за один шаг." +explanation: "Паттерны записей позволяют разложить компоненты записи непосредственно в instanceof и switch. Вложенные паттерны также поддерживаются, что обеспечивает глубокое сопоставление без промежуточных переменных." +whyModernWins: +- icon: "🎯" + title: "Прямой доступ" + desc: "Обращаться к компонентам записи без ручного вызова аксессоров." +- icon: "🪆" + title: "Вложенность" + desc: "Паттерны можно вкладывать — сопоставлять внутренние записи в одном выражении." +- icon: "📏" + title: "Компактный код" + desc: "Пять строк превращаются в две — меньше церемоний, та же ясность." +support: + description: "Доступно в JDK 21 LTS (сент. 2023)" diff --git a/translations/content/ru/language/records-for-data-classes.yaml b/translations/content/ru/language/records-for-data-classes.yaml new file mode 100644 index 0000000..e46fb63 --- /dev/null +++ b/translations/content/ru/language/records-for-data-classes.yaml @@ -0,0 +1,17 @@ +title: "Записи для классов данных" +oldApproach: "Многословный POJO" +modernApproach: "record" +summary: "Одна строка заменяет более 30 строк шаблонного кода для неизменяемых носителей данных." +explanation: "Записи автоматически генерируют конструктор, аксессоры (x(), y()), equals(), hashCode() и toString(). Они неизменяемы по своей природе и идеально подходят для DTO, объектов-значений и pattern matching." +whyModernWins: +- icon: "⚡" + title: "Однострочное определение" + desc: "Одна строка заменяет конструктор, геттеры, equals, hashCode, toString." +- icon: "🔒" + title: "Неизменяемость по умолчанию" + desc: "Все поля final — никаких ловушек с сеттерами." +- icon: "🧩" + title: "Дружественность к паттернам" + desc: "Записи работают с паттернами деструктуризации в switch и instanceof." +support: + description: "Доступно в JDK 16 (март 2021)" diff --git a/translations/content/ru/language/sealed-classes.yaml b/translations/content/ru/language/sealed-classes.yaml new file mode 100644 index 0000000..d52b1e7 --- /dev/null +++ b/translations/content/ru/language/sealed-classes.yaml @@ -0,0 +1,17 @@ +title: "Запечатанные классы для иерархий типов" +oldApproach: "Открытая иерархия" +modernApproach: "sealed permits" +summary: "Ограничить, какие классы могут расширять тип — для исчерпывающих switch." +explanation: "Запечатанные классы определяют закрытое множество подтипов. Компилятор знает все возможные случаи и позволяет использовать исчерпывающий pattern matching без ветки default. В сочетании с записями они моделируют алгебраические типы данных." +whyModernWins: +- icon: "🔐" + title: "Контролируемая иерархия" + desc: "Расширять могут только разрешённые подтипы — никаких неожиданных подклассов." +- icon: "✅" + title: "Исчерпывающее сопоставление" + desc: "Компилятор проверяет, что switch охватывает все случаи — default не нужен." +- icon: "📐" + title: "Алгебраические типы данных" + desc: "Естественное моделирование типов-сумм — sealed + records = ADT в Java." +support: + description: "Доступно в JDK 17 LTS (сент. 2021)" diff --git a/translations/content/ru/language/static-members-in-inner-classes.yaml b/translations/content/ru/language/static-members-in-inner-classes.yaml new file mode 100644 index 0000000..8ad0124 --- /dev/null +++ b/translations/content/ru/language/static-members-in-inner-classes.yaml @@ -0,0 +1,17 @@ +title: "Статические члены во внутренних классах" +oldApproach: "Необходимость статически вложенного класса" +modernApproach: "Статические члены во внутренних классах" +summary: "Определять статические члены во внутренних классах без использования статически вложенных классов." +explanation: "До Java 16 только статически вложенные классы могли содержать статические члены. Внутренние (нестатические) классы не могли иметь статики, поскольку требовали экземпляра охватывающего класса. Java 16 ослабляет это ограничение и позволяет статические поля, методы и даже вложенные типы во внутренних классах." +whyModernWins: +- icon: "🔓" + title: "Больше гибкости" + desc: "Внутренние классы теперь при необходимости могут иметь статические члены." +- icon: "🧩" + title: "Общее состояние" + desc: "Отслеживать общее состояние между экземплярами внутреннего класса." +- icon: "📐" + title: "Свобода проектирования" + desc: "Не нужно повышать до статически вложенного класса из-за одного статического поля." +support: + description: "Доступно в JDK 16 (март 2021)" diff --git a/translations/content/ru/language/static-methods-in-interfaces.yaml b/translations/content/ru/language/static-methods-in-interfaces.yaml new file mode 100644 index 0000000..44a4602 --- /dev/null +++ b/translations/content/ru/language/static-methods-in-interfaces.yaml @@ -0,0 +1,17 @@ +title: "Статические методы в интерфейсах" +oldApproach: "Вспомогательные классы" +modernApproach: "Статические методы интерфейса" +summary: "Добавлять статические вспомогательные методы непосредственно в интерфейсы вместо отдельных вспомогательных классов." +explanation: "До Java 8 вспомогательные методы, относящиеся к интерфейсу, должны были находиться в отдельном классе (например, Collections для Collection). Статические методы в интерфейсах позволяют держать связанные вспомогательные функции вместе. Широко используется в современных API: Comparator.comparing(), Stream.of() и List.of()." +whyModernWins: +- icon: "📦" + title: "Лучшая организация" + desc: "Хранить связанные вспомогательные функции рядом с интерфейсом, а не в отдельном классе." +- icon: "🔍" + title: "Обнаруживаемость" + desc: "Фабричные и вспомогательные методы находятся там, где их ожидают." +- icon: "🧩" + title: "Связность API" + desc: "Больше не нужны отдельные классы *Utils или *Helper." +support: + description: "Доступно с JDK 8 (март 2014)" diff --git a/translations/content/ru/language/switch-expressions.yaml b/translations/content/ru/language/switch-expressions.yaml new file mode 100644 index 0000000..329a767 --- /dev/null +++ b/translations/content/ru/language/switch-expressions.yaml @@ -0,0 +1,17 @@ +title: "Switch-выражения" +oldApproach: "Оператор switch" +modernApproach: "Switch-выражение" +summary: "Switch как выражение, возвращающее значение — без break и без fall-through." +explanation: "Switch-выражения возвращают значение напрямую, используют стрелочный синтаксис для предотвращения ошибок fall-through, а компилятор проверяет исчерпываемость. Это заменяет подверженную ошибкам форму оператора." +whyModernWins: +- icon: "🎯" + title: "Возвращает значение" + desc: "Присвоить результат switch напрямую — временная переменная не нужна." +- icon: "🛡️" + title: "Нет fall-through" + desc: "Стрелочный синтаксис устраняет случайные ошибки fall-through из-за пропущенного break." +- icon: "✅" + title: "Проверка исчерпываемости" + desc: "Компилятор обеспечивает охват всех случаев." +support: + description: "Доступно в JDK 14 (март 2020)" diff --git a/translations/content/ru/language/text-blocks-for-multiline-strings.yaml b/translations/content/ru/language/text-blocks-for-multiline-strings.yaml new file mode 100644 index 0000000..ddead24 --- /dev/null +++ b/translations/content/ru/language/text-blocks-for-multiline-strings.yaml @@ -0,0 +1,17 @@ +title: "Текстовые блоки для многострочных строк" +oldApproach: "Конкатенация строк" +modernApproach: "Текстовые блоки" +summary: "Писать многострочные строки естественно с помощью текстовых блоков с тройными кавычками." +explanation: "Текстовые блоки позволяют писать многострочные строки именно так, как они выглядят. Больше не нужны escape-последовательности для кавычек или \\n. Компилятор автоматически удаляет случайные отступы." +whyModernWins: +- icon: "📖" + title: "Читается как есть" + desc: "JSON, SQL и HTML в исходном коде выглядят как настоящие JSON, SQL и HTML." +- icon: "🚫" + title: "Никаких escape-последовательностей" + desc: "Встроенные кавычки не требуют экранирования обратной косой чертой." +- icon: "📐" + title: "Умные отступы" + desc: "Ведущие пробелы автоматически обрезаются по позиции закрывающего разделителя." +support: + description: "Доступно в JDK 15 (сент. 2020)" diff --git a/translations/content/ru/language/type-inference-with-var.yaml b/translations/content/ru/language/type-inference-with-var.yaml new file mode 100644 index 0000000..71ce0c5 --- /dev/null +++ b/translations/content/ru/language/type-inference-with-var.yaml @@ -0,0 +1,17 @@ +title: "Вывод типов с var" +oldApproach: "Явные типы" +modernApproach: "Ключевое слово var" +summary: "Использовать var для вывода типов локальных переменных — меньше шума, та же безопасность." +explanation: "Начиная с Java 10 компилятор выводит типы локальных переменных из правой части выражения. Это уменьшает визуальный шум без ущерба для типобезопасности. var рекомендуется там, где тип очевиден из контекста." +whyModernWins: +- icon: "⚡" + title: "Меньше шаблонного кода" + desc: "Не нужно повторять сложные обобщённые типы по обе стороны присваивания." +- icon: "👁" + title: "Лучшая читаемость" + desc: "Фокус на именах переменных и значениях, а не на объявлениях типов." +- icon: "🔒" + title: "По-прежнему типобезопасно" + desc: "Компилятор выводит и применяет точный тип во время компиляции." +support: + description: "Доступно в JDK 10 (март 2018)" diff --git a/translations/content/ru/language/unnamed-variables.yaml b/translations/content/ru/language/unnamed-variables.yaml new file mode 100644 index 0000000..f52f1f6 --- /dev/null +++ b/translations/content/ru/language/unnamed-variables.yaml @@ -0,0 +1,17 @@ +title: "Безымянные переменные с _" +oldApproach: "Неиспользуемая переменная" +modernApproach: "_ как заполнитель" +summary: "Использовать _, чтобы явно указать, что переменная намеренно не используется." +explanation: "Безымянные переменные сообщают читателям и инструментам, что значение намеренно игнорируется. Больше не нужны соглашения об именовании типа «ignored» или «unused», больше нет предупреждений IDE." +whyModernWins: +- icon: "📢" + title: "Явное намерение" + desc: "_ явно говорит «это значение здесь не нужно»." +- icon: "🔇" + title: "Нет предупреждений" + desc: "IDE и линтеры больше не помечают намеренно неиспользуемые переменные." +- icon: "🧹" + title: "Более чистые лямбды" + desc: "Лямбды с несколькими параметрами выглядят чище, когда нужны только некоторые из них." +support: + description: "Финализировано в JDK 22 (JEP 456, март 2024)." diff --git a/translations/content/ru/security/key-derivation-functions.yaml b/translations/content/ru/security/key-derivation-functions.yaml new file mode 100644 index 0000000..6776795 --- /dev/null +++ b/translations/content/ru/security/key-derivation-functions.yaml @@ -0,0 +1,19 @@ +title: Функции формирования ключей +oldApproach: Ручной PBKDF2 +modernApproach: KDF API +summary: Формирование криптографических ключей с помощью стандартного KDF API. +explanation: KDF API предоставляет стандартный интерфейс для функций формирования + ключей, включая HKDF. Он заменяет неудобный шаблон SecretKeyFactory + PBEKeySpec + на чистый строительный API. +whyModernWins: +- icon: 📐 + title: Чистый API + desc: Шаблон строителя вместо неудобных конструкторов KeySpec. +- icon: 🔧 + title: Поддержка HKDF + desc: Современный алгоритм HKDF наряду с PBKDF2. +- icon: 🛡️ + title: Стандарт + desc: Единый API для всех алгоритмов формирования ключей. +support: + description: Финализировано в JDK 25 LTS (JEP 510, сент. 2025). diff --git a/translations/content/ru/security/pem-encoding.yaml b/translations/content/ru/security/pem-encoding.yaml new file mode 100644 index 0000000..ddbb8d4 --- /dev/null +++ b/translations/content/ru/security/pem-encoding.yaml @@ -0,0 +1,19 @@ +title: Кодирование/декодирование PEM +oldApproach: Ручной Base64 + заголовки +modernApproach: PEM API +summary: Нативное кодирование и декодирование криптографических объектов в формате PEM. +explanation: PEM API предоставляет стандартное кодирование/декодирование для сертификатов, + ключей и других криптографических объектов в формате PEM. Больше никакого ручного + оборачивания Base64 с заголовками BEGIN/END. +whyModernWins: +- icon: 🧹 + title: Без ручного Base64 + desc: Заголовки PEM, перенос строк и Base64 обрабатываются автоматически. +- icon: 🔄 + title: Двунаправленный + desc: Кодирование в PEM и декодирование из PEM с помощью одного API. +- icon: 🛡️ + title: Стандартный формат + desc: Создаёт PEM-вывод, соответствующий RFC 7468. +support: + description: Предварительная версия в JDK 25 (JEP 470). Требует --enable-preview. diff --git a/translations/content/ru/security/random-generator.yaml b/translations/content/ru/security/random-generator.yaml new file mode 100644 index 0000000..2c991c6 --- /dev/null +++ b/translations/content/ru/security/random-generator.yaml @@ -0,0 +1,21 @@ +title: Интерфейс RandomGenerator +oldApproach: new Random() / ThreadLocalRandom +modernApproach: Фабрика RandomGenerator +summary: Использование интерфейса RandomGenerator для выбора алгоритмов генерации + случайных чисел по имени без привязки к конкретному классу. +explanation: JDK 17 представил RandomGenerator как общий интерфейс для всех реализаций + RNG. Вместо жёсткой привязки к new Random() или ThreadLocalRandom можно выбирать + алгоритмы по имени через фабрику, что упрощает переключение между алгоритмами, + оптимизированными для разных сценариев (скорость, статистическое качество, делимость). +whyModernWins: +- icon: 🔧 + title: Независимость от алгоритма + desc: Выбор лучшего алгоритма RNG по имени без изменения структуры кода. +- icon: ⚡ + title: Лучшие алгоритмы + desc: Доступ к современным генераторам LXM с превосходными статистическими свойствами. +- icon: 🔗 + title: Единый API + desc: Один интерфейс охватывает Random, ThreadLocalRandom, SplittableRandom и другие. +support: + description: Доступно с JDK 17 (сентябрь 2021, JEP 356). diff --git a/translations/content/ru/security/strong-random.yaml b/translations/content/ru/security/strong-random.yaml new file mode 100644 index 0000000..0d78ecb --- /dev/null +++ b/translations/content/ru/security/strong-random.yaml @@ -0,0 +1,19 @@ +title: Генерация надёжных случайных чисел +oldApproach: new SecureRandom() +modernApproach: getInstanceStrong() +summary: Получение наиболее надёжной реализации SecureRandom на платформе. +explanation: getInstanceStrong() возвращает реализацию SecureRandom, настроенную + как наиболее надёжная на платформе. Это управляется свойством безопасности + securerandom.strongAlgorithms. +whyModernWins: +- icon: 🛡️ + title: Наиболее надёжный + desc: Автоматически выбирает лучший алгоритм для платформы. +- icon: 📖 + title: Явное намерение + desc: Явно указывает, что требуется высокая степень случайности. +- icon: 🔧 + title: Настраиваемый + desc: Администраторы могут изменить надёжный алгоритм через свойства безопасности. +support: + description: Широко доступно с JDK 9 (сент. 2017) diff --git a/translations/content/ru/security/tls-default.yaml b/translations/content/ru/security/tls-default.yaml new file mode 100644 index 0000000..b74c174 --- /dev/null +++ b/translations/content/ru/security/tls-default.yaml @@ -0,0 +1,19 @@ +title: TLS 1.3 по умолчанию +oldApproach: Ручная настройка TLS +modernApproach: TLS 1.3 по умолчанию +summary: "TLS 1.3 включён по умолчанию — явная настройка протокола не требуется." +explanation: Java 11 добавила поддержку TLS 1.3 и сделала его предпочтительным протоколом. + HttpClient использует его автоматически. Больше не нужно вручную указывать версии + протокола для защищённых соединений. +whyModernWins: +- icon: 🛡️ + title: Более безопасный + desc: TLS 1.3 удаляет устаревшие наборы шифров и шаблоны рукопожатия. +- icon: ⚡ + title: Более быстрое рукопожатие + desc: TLS 1.3 завершается за один обмен вместо двух. +- icon: 🆓 + title: Без конфигурации + desc: "Безопасен по умолчанию — явный выбор протокола не требуется." +support: + description: Широко доступно с JDK 11 (сент. 2018) diff --git a/translations/content/ru/streams/collectors-flatmapping.yaml b/translations/content/ru/streams/collectors-flatmapping.yaml new file mode 100644 index 0000000..34f90f4 --- /dev/null +++ b/translations/content/ru/streams/collectors-flatmapping.yaml @@ -0,0 +1,19 @@ +title: Collectors.flatMapping() +oldApproach: Вложенный flatMap +modernApproach: flatMapping() +summary: Использование flatMapping() для сглаживания внутри группирующего Collector. +explanation: Collectors.flatMapping() применяет отображение «один ко многим» в качестве + нижестоящего Collector. Это эквивалент Collector для Stream.flatMap() — полезен + внутри groupingBy или partitioningBy. +whyModernWins: +- icon: 🧩 + title: Компонуемый + desc: Работает как нижестоящий Collector внутри groupingBy. +- icon: 📐 + title: Один проход + desc: Сглаживание и группировка за один проход Stream. +- icon: 🔗 + title: Вкладываемый + desc: Сочетается с другими нижестоящими Collectors. +support: + description: Широко доступно с JDK 9 (сент. 2017) diff --git a/translations/content/ru/streams/optional-ifpresentorelse.yaml b/translations/content/ru/streams/optional-ifpresentorelse.yaml new file mode 100644 index 0000000..c97827c --- /dev/null +++ b/translations/content/ru/streams/optional-ifpresentorelse.yaml @@ -0,0 +1,19 @@ +title: Optional.ifPresentOrElse() +oldApproach: if/else с Optional +modernApproach: ifPresentOrElse() +summary: Обработка обоих случаев Optional — наличие и отсутствие значения — в одном + вызове. +explanation: ifPresentOrElse() принимает Consumer для случая наличия значения и Runnable + для случая пустого Optional. Устраняет антипаттерн isPresent/get. +whyModernWins: +- icon: 📏 + title: Единое выражение + desc: Оба случая обрабатываются в одном вызове метода. +- icon: 🚫 + title: Без get() + desc: Устраняет опасный паттерн isPresent() + get(). +- icon: 🔗 + title: Цепочный + desc: Естественно связывается после findUser() или любого метода, возвращающего Optional. +support: + description: Широко доступно с JDK 9 (сент. 2017) diff --git a/translations/content/ru/streams/optional-or.yaml b/translations/content/ru/streams/optional-or.yaml new file mode 100644 index 0000000..2aa4bf8 --- /dev/null +++ b/translations/content/ru/streams/optional-or.yaml @@ -0,0 +1,19 @@ +title: Optional.or() как запасной вариант +oldApproach: Вложенный запасной вариант +modernApproach: Цепочка .or() +summary: Цепочка запасных вариантов Optional без вложенных проверок. +explanation: Optional.or() возвращает исходный Optional, если он содержит значение, + в противном случае вычисляет Supplier для получения альтернативного Optional. + Supplier-ы ленивы — они вызываются только при необходимости. +whyModernWins: +- icon: 🔗 + title: Цепочный + desc: Выстраивать запасные варианты в читаемый пайплайн. +- icon: ⚡ + title: Ленивое вычисление + desc: Supplier запасного варианта выполняется только при необходимости. +- icon: 📖 + title: Декларативный + desc: "Читается как 'попробуй основное, или вторичное, или по умолчанию'." +support: + description: Широко доступно с JDK 9 (сент. 2017) diff --git a/translations/content/ru/streams/predicate-not.yaml b/translations/content/ru/streams/predicate-not.yaml new file mode 100644 index 0000000..b572c8b --- /dev/null +++ b/translations/content/ru/streams/predicate-not.yaml @@ -0,0 +1,20 @@ +title: Predicate.not() для отрицания +oldApproach: Отрицание через лямбду +modernApproach: Predicate.not() +summary: Использование Predicate.not() для чистого отрицания ссылок на методы вместо + написания лямбда-обёрток. +explanation: До Java 11 для отрицания ссылки на метод требовалась её обёртка в лямбду. + Predicate.not() позволяет напрямую отрицать любой предикат, что делает код читаемым + и согласованным со стилем ссылок на методы во всём пайплайне Stream. +whyModernWins: +- icon: 👁 + title: Чистое отрицание + desc: Не нужны лямбда-обёртки для ссылок на методы только ради отрицания. +- icon: 🔗 + title: Компонуемый + desc: Работает с любым Predicate и позволяет строить чистые цепочки предикатов. +- icon: 📖 + title: Естественно читаемый + desc: Predicate.not(String::isBlank) читается как естественный язык. +support: + description: Доступно с JDK 11 (сентябрь 2018). diff --git a/translations/content/ru/streams/stream-gatherers.yaml b/translations/content/ru/streams/stream-gatherers.yaml new file mode 100644 index 0000000..d878150 --- /dev/null +++ b/translations/content/ru/streams/stream-gatherers.yaml @@ -0,0 +1,19 @@ +title: Stream Gatherers +oldApproach: Пользовательский Collector +modernApproach: gather() +summary: Использование Gatherers для пользовательских промежуточных операций Stream. +explanation: Gatherers — это новая промежуточная операция Stream, позволяющая выражать + сложные преобразования, такие как скользящие окна, группы фиксированного размера + и операции сканирования, которые были невозможны со стандартными операциями Stream. +whyModernWins: +- icon: 🧩 + title: Компонуемый + desc: Gatherers сочетаются с другими операциями Stream. +- icon: 📦 + title: Встроенные операции + desc: "windowFixed, windowSliding, fold, scan доступны из коробки." +- icon: 🔧 + title: Расширяемый + desc: Написание собственных Gatherers для любых промежуточных преобразований. +support: + description: "Финализировано в JDK 24 (JEP 485, март 2025)." diff --git a/translations/content/ru/streams/stream-iterate-predicate.yaml b/translations/content/ru/streams/stream-iterate-predicate.yaml new file mode 100644 index 0000000..046aab2 --- /dev/null +++ b/translations/content/ru/streams/stream-iterate-predicate.yaml @@ -0,0 +1,19 @@ +title: Stream.iterate() с предикатом +oldApproach: iterate + limit +modernApproach: iterate(seed, pred, op) +summary: Использование предиката для завершения итерации — как цикл for в виде Stream. +explanation: "Трёхаргументный Stream.iterate(seed, hasNext, next) работает как цикл\ + \ for: seed — начальное значение, hasNext определяет остановку, next генерирует\ + \ следующее значение." +whyModernWins: +- icon: 🎯 + title: Естественная остановка + desc: Остановка по условию, а не по произвольному ограничению. +- icon: 📐 + title: Эквивалент цикла for + desc: Та же семантика, что у for(seed; hasNext; next). +- icon: 🛡️ + title: Нет риска бесконечного Stream + desc: Предикат гарантирует завершение. +support: + description: Широко доступно с JDK 9 (сент. 2017) diff --git a/translations/content/ru/streams/stream-mapmulti.yaml b/translations/content/ru/streams/stream-mapmulti.yaml new file mode 100644 index 0000000..b8c0b41 --- /dev/null +++ b/translations/content/ru/streams/stream-mapmulti.yaml @@ -0,0 +1,20 @@ +title: Stream.mapMulti() +oldApproach: flatMap + List +modernApproach: mapMulti() +summary: Вывод нуля или более элементов на входной элемент без создания промежуточных + Stream. +explanation: mapMulti() — императивная альтернатива flatMap, которая избегает создания + промежуточных объектов Stream для каждого элемента. Эффективнее, когда отображение + порождает небольшое количество элементов. +whyModernWins: +- icon: ⚡ + title: Меньше аллокаций + desc: Не создаётся промежуточный Stream для каждого элемента. +- icon: 🎯 + title: Императивный стиль + desc: Использование циклов и условий напрямую. +- icon: 📐 + title: Гибкий + desc: Вывод нуля, одного или нескольких элементов с полным контролем. +support: + description: Широко доступно с JDK 16 (март 2021) diff --git a/translations/content/ru/streams/stream-of-nullable.yaml b/translations/content/ru/streams/stream-of-nullable.yaml new file mode 100644 index 0000000..a6efe03 --- /dev/null +++ b/translations/content/ru/streams/stream-of-nullable.yaml @@ -0,0 +1,19 @@ +title: Stream.ofNullable() +oldApproach: Проверка на null +modernApproach: ofNullable() +summary: Создание Stream с нулём или одним элементом из nullable-значения. +explanation: Stream.ofNullable() возвращает однопоточный Stream, если значение не + null, или пустой Stream, если оно null. Устраняет паттерн тернарной проверки на + null. +whyModernWins: +- icon: 📏 + title: Краткость + desc: Один вызов заменяет тернарное выражение. +- icon: 🔗 + title: flatMap-совместимый + desc: Отлично подходит внутри flatMap для пропуска null-значений. +- icon: 🛡️ + title: Null-безопасный + desc: Нет риска NPE — null превращается в пустой Stream. +support: + description: Широко доступно с JDK 9 (сент. 2017) diff --git a/translations/content/ru/streams/stream-takewhile-dropwhile.yaml b/translations/content/ru/streams/stream-takewhile-dropwhile.yaml new file mode 100644 index 0000000..81d4fd4 --- /dev/null +++ b/translations/content/ru/streams/stream-takewhile-dropwhile.yaml @@ -0,0 +1,19 @@ +title: Stream takeWhile / dropWhile +oldApproach: Ручной цикл +modernApproach: takeWhile/dropWhile +summary: Брать или пропускать элементы из Stream на основе предиката. +explanation: takeWhile() возвращает элементы, пока предикат истинен, и останавливается + при первом ложном значении. dropWhile() пропускает элементы, пока предикат истинен, + и возвращает остальные. Оба лучше работают с упорядоченными Stream. +whyModernWins: +- icon: 🎯 + title: Оценка с коротким замыканием + desc: Прекращает обработку, как только предикат не выполняется. +- icon: 🔗 + title: Совместимый с пайплайном + desc: Естественно связывается с другими операциями Stream. +- icon: 📖 + title: Декларативный + desc: "takeWhile читается как естественный язык: 'брать, пока меньше 100'." +support: + description: Широко доступно с JDK 9 (сент. 2017) diff --git a/translations/content/ru/streams/stream-tolist.yaml b/translations/content/ru/streams/stream-tolist.yaml new file mode 100644 index 0000000..947504e --- /dev/null +++ b/translations/content/ru/streams/stream-tolist.yaml @@ -0,0 +1,19 @@ +title: Stream.toList() +oldApproach: Collectors.toList() +modernApproach: .toList() +summary: Терминальный toList() заменяет многословный collect(Collectors.toList()). +explanation: "Stream.toList() возвращает неизменяемый список. Это эквивалент\ + \ .collect(Collectors.toUnmodifiableList()), но гораздо короче. Примечание: результат\ + \ неизменяем, в отличие от Collectors.toList()." +whyModernWins: +- icon: 📏 + title: 7 символов против 24 + desc: .toList() заменяет .collect(Collectors.toList()). +- icon: 🔒 + title: Неизменяемый + desc: Результирующий список нельзя изменить. +- icon: 📖 + title: Fluent + desc: Читается естественно в конце пайплайна. +support: + description: Широко доступно с JDK 16 (март 2021) diff --git a/translations/content/ru/streams/virtual-thread-executor.yaml b/translations/content/ru/streams/virtual-thread-executor.yaml new file mode 100644 index 0000000..0fcf38e --- /dev/null +++ b/translations/content/ru/streams/virtual-thread-executor.yaml @@ -0,0 +1,20 @@ +title: Исполнитель виртуальных потоков +oldApproach: Фиксированный пул потоков +modernApproach: Virtual-Thread-Executor +summary: Использование исполнителей виртуальных потоков для неограниченного лёгковесного + параллелизма. +explanation: Исполнитель виртуальных потоков создаёт новый виртуальный поток для + каждой задачи. Не нужно задавать размер пула — виртуальные потоки достаточно дёшевы, + чтобы создавать их миллионами. +whyModernWins: +- icon: ♾️ + title: Без настройки размера + desc: Не нужно задавать размер пула — создавать столько потоков, сколько нужно. +- icon: ⚡ + title: Лёгковесный + desc: Виртуальные потоки используют КБ вместо МБ памяти. +- icon: 🧹 + title: Auto-closeable + desc: try-with-resources автоматически выполняет завершение работы. +support: + description: Широко доступно с JDK 21 LTS (сент. 2023) diff --git a/translations/content/ru/strings/string-chars-stream.yaml b/translations/content/ru/strings/string-chars-stream.yaml new file mode 100644 index 0000000..1a90bce --- /dev/null +++ b/translations/content/ru/strings/string-chars-stream.yaml @@ -0,0 +1,19 @@ +title: Символы строки как поток +oldApproach: Ручной цикл +modernApproach: Поток chars() +summary: Обработка символов строки в виде конвейера потока. +explanation: String.chars() возвращает IntStream значений символов, обеспечивая + функциональную обработку. Для поддержки Unicode метод codePoints() корректно + обрабатывает дополнительные символы. +whyModernWins: +- icon: 🔗 + title: Цепочки вызовов + desc: Применяйте filter, map, collect к потокам символов. +- icon: 📐 + title: Декларативный стиль + desc: Описывает что делать, а не как итерировать. +- icon: 🌐 + title: Поддержка Unicode + desc: codePoints() корректно обрабатывает эмодзи и дополнительные символы. +support: + description: Доступно с JDK 8+ (улучшено в 9+) diff --git a/translations/content/ru/strings/string-formatted.yaml b/translations/content/ru/strings/string-formatted.yaml new file mode 100644 index 0000000..944aaec --- /dev/null +++ b/translations/content/ru/strings/string-formatted.yaml @@ -0,0 +1,19 @@ +title: String.formatted() +oldApproach: String.format() +modernApproach: formatted() +summary: Вызов formatted() непосредственно на строке-шаблоне. +explanation: String.formatted() — это метод экземпляра, аналогичный String.format(), + но вызываемый на строке форматирования. Он читается более естественно в потоке + слева направо. +whyModernWins: +- icon: 📖 + title: Естественная читаемость + desc: "Template.formatted(args) воспринимается лучше, чем String.format(template, args)." +- icon: 🔗 + title: Цепочки вызовов + desc: Можно объединять в цепочку с другими строковыми методами. +- icon: 📏 + title: Меньше кода + desc: Устраняет избыточный статический вызов String.format(). +support: + description: Широко доступно с JDK 15 (сентябрь 2020) diff --git a/translations/content/ru/strings/string-indent-transform.yaml b/translations/content/ru/strings/string-indent-transform.yaml new file mode 100644 index 0000000..ba358b5 --- /dev/null +++ b/translations/content/ru/strings/string-indent-transform.yaml @@ -0,0 +1,19 @@ +title: String.indent() и transform() +oldApproach: Ручное добавление отступа +modernApproach: indent() / transform() +summary: Добавление отступов к тексту и цепочечное применение строковых преобразований. +explanation: indent(n) добавляет n пробелов к каждой строке. transform(fn) применяет + произвольную функцию и возвращает результат, позволяя выстраивать цепочки + строковых операций. +whyModernWins: +- icon: 📏 + title: Встроенный метод + desc: Добавление отступов — частая операция, теперь это один вызов. +- icon: 🔗 + title: Цепочки вызовов + desc: transform() позволяет строить цепочки операций над строками. +- icon: 🧹 + title: Чистый код + desc: Не нужно вручную разбивать строки и писать циклы с StringBuilder. +support: + description: Широко доступно с JDK 12 (март 2019) diff --git a/translations/content/ru/strings/string-isblank.yaml b/translations/content/ru/strings/string-isblank.yaml new file mode 100644 index 0000000..78c449c --- /dev/null +++ b/translations/content/ru/strings/string-isblank.yaml @@ -0,0 +1,18 @@ +title: String.isBlank() +oldApproach: trim().isEmpty() +modernApproach: isBlank() +summary: Проверка пустых строк одним вызовом метода. +explanation: isBlank() возвращает true, если строка пуста или содержит только + пробельные символы, включая Unicode-пробелы, которые trim() не учитывает. +whyModernWins: +- icon: 📖 + title: Самодокументирующийся + desc: isBlank() точно описывает то, что проверяет. +- icon: 🌐 + title: Поддержка Unicode + desc: Обрабатывает все пробельные символы Unicode, а не только ASCII. +- icon: ⚡ + title: Без аллокаций + desc: Не создаёт промежуточную обрезанную строку. +support: + description: Широко доступно с JDK 11 (сентябрь 2018) diff --git a/translations/content/ru/strings/string-lines.yaml b/translations/content/ru/strings/string-lines.yaml new file mode 100644 index 0000000..c56535e --- /dev/null +++ b/translations/content/ru/strings/string-lines.yaml @@ -0,0 +1,21 @@ +title: String.lines() для разбиения на строки +oldApproach: "split(\"\\\\n\")" +modernApproach: lines() +summary: Использование String.lines() для разбиения текста на поток строк без + издержек регулярных выражений. +explanation: "String.lines() возвращает Stream
строк, разбитых по \\n,\ + \ \\r или \\r\\n. Это ленивее и эффективнее, чем split(), избегает компиляции\ + \ регулярных выражений и естественно интегрируется в Stream API для дальнейшей\ + \ обработки." +whyModernWins: +- icon: ⚡ + title: Ленивый поток + desc: Строки генерируются по запросу, а не все сразу, как в split(). +- icon: 🔧 + title: Универсальные разделители строк + desc: "Автоматически обрабатывает \\n, \\r и \\r\\n без регулярных выражений." +- icon: 🔗 + title: Интеграция со Stream + desc: Возвращает поток для прямого использования с filter, map, collect. +support: + description: Доступно с JDK 11 (сентябрь 2018). diff --git a/translations/content/ru/strings/string-repeat.yaml b/translations/content/ru/strings/string-repeat.yaml new file mode 100644 index 0000000..49c4fde --- /dev/null +++ b/translations/content/ru/strings/string-repeat.yaml @@ -0,0 +1,19 @@ +title: String.repeat() +oldApproach: Цикл с StringBuilder +modernApproach: repeat() +summary: Повторение строки n раз без цикла. +explanation: "String.repeat(int) возвращает строку, объединённую с собой n раз.\ + \ Обрабатывает граничные случаи: repeat(0) возвращает пустую строку, repeat(1)\ + \ возвращает ту же строку." +whyModernWins: +- icon: 📏 + title: Однострочник + desc: Заменяет 5 строк кода с StringBuilder одним вызовом. +- icon: ⚡ + title: Оптимизировано + desc: Внутренняя реализация оптимизирована для большого числа повторений. +- icon: 📖 + title: Ясное намерение + desc: repeat(3) сразу передаёт цель. +support: + description: Широко доступно с JDK 11 (сентябрь 2018) diff --git a/translations/content/ru/strings/string-strip.yaml b/translations/content/ru/strings/string-strip.yaml new file mode 100644 index 0000000..90a3461 --- /dev/null +++ b/translations/content/ru/strings/string-strip.yaml @@ -0,0 +1,20 @@ +title: String.strip() vs trim() +oldApproach: trim() +modernApproach: strip() +summary: Unicode-совместимое удаление пробелов с помощью strip(), stripLeading(), + stripTrailing(). +explanation: trim() удаляет только символы ≤ U+0020 (управляющие символы ASCII + и пробел). strip() использует Character.isWhitespace(), который обрабатывает + Unicode-пробелы, такие как неразрывный пробел, идеографический пробел и др. +whyModernWins: +- icon: 🌐 + title: Корректная работа с Unicode + desc: Обрабатывает все пробельные символы из всех систем письма. +- icon: 🎯 + title: Направленность + desc: stripLeading() и stripTrailing() для одностороннего удаления. +- icon: 🛡️ + title: Меньше ошибок + desc: Нет неожиданных пробелов в интернациональном тексте. +support: + description: Широко доступно с JDK 11 (сентябрь 2018) diff --git a/translations/content/ru/tooling/aot-class-preloading.yaml b/translations/content/ru/tooling/aot-class-preloading.yaml new file mode 100644 index 0000000..a5501fb --- /dev/null +++ b/translations/content/ru/tooling/aot-class-preloading.yaml @@ -0,0 +1,20 @@ +title: AOT-предзагрузка классов +oldApproach: Холодный старт при каждом запуске +modernApproach: AOT-кэш +summary: Кэширование загрузки и компиляции классов для мгновенного запуска. +explanation: AOT-предзагрузка классов сохраняет загруженные и связанные классы из + обучающего прогона в кэш. При последующих запусках классы загружаются из кэша, + пропуская этапы верификации и компоновки. В сочетании с AOT-компиляцией это + резко сокращает время запуска. +whyModernWins: +- icon: ⚡ + title: Более быстрый запуск + desc: Пропуск загрузки, верификации и компоновки классов. +- icon: 📦 + title: Кэшированное состояние + desc: Обучающий прогон фиксирует оптимальное состояние классов. +- icon: 🔧 + title: Без изменений в коде + desc: Работает с существующими приложениями — достаточно добавить флаги JVM. +support: + description: Доступно как стандартная функция в JDK 25 LTS (JEP 514/515, сентябрь 2025). diff --git a/translations/content/ru/tooling/built-in-http-server.yaml b/translations/content/ru/tooling/built-in-http-server.yaml new file mode 100644 index 0000000..4ee600d --- /dev/null +++ b/translations/content/ru/tooling/built-in-http-server.yaml @@ -0,0 +1,25 @@ +title: Встроенный HTTP-сервер +oldApproach: Внешний сервер / фреймворк +modernApproach: CLI jwebserver +summary: Java 18 включает встроенный минималистичный HTTP-сервер для прототипирования + и раздачи файлов. +explanation: В JDK 18 добавлен простой HTTP-сервер файлов без зависимостей, доступный + через инструмент командной строки jwebserver или API SimpleFileServer. Он раздаёт + статические файлы из указанного каталога без какой-либо конфигурации. CLI-инструмент + идеально подходит для быстрого прототипирования, тестирования и ситуативного + обмена файлами — внешние зависимости или фреймворки не нужны. API позволяет + использовать его программно с настраиваемыми обработчиками и уровнями вывода. +whyModernWins: +- icon: 🚀 + title: Никакой настройки + desc: "Запустите jwebserver в любом каталоге — установка, конфигурация и зависимости\ + \ не нужны." +- icon: 📦 + title: Встроен в JDK + desc: Поставляется с каждой установкой JDK 18+, всегда доступен на любой машине с Java. +- icon: 🧪 + title: Идеально для прототипирования + desc: Мгновенная раздача статических файлов для тестирования HTML, API или + фронтенд-разработки. +support: + description: Доступно начиная с JDK 18 (март 2022) diff --git a/translations/content/ru/tooling/compact-object-headers.yaml b/translations/content/ru/tooling/compact-object-headers.yaml new file mode 100644 index 0000000..ba51517 --- /dev/null +++ b/translations/content/ru/tooling/compact-object-headers.yaml @@ -0,0 +1,21 @@ +title: Компактные заголовки объектов +oldApproach: 128-битный заголовок +modernApproach: 64-битный заголовок +summary: Уменьшение размера заголовков объектов вдвое для повышения плотности + хранения и эффективности кэша. +explanation: Компактные заголовки объектов сокращают накладные расходы на каждый + объект со 128 бит до 64 бит на 64-битных платформах. Это экономит память и + улучшает использование кэша, особенно для приложений с большим количеством + небольших объектов. +whyModernWins: +- icon: 📦 + title: "Заголовки меньше на 50\u202F%" + desc: 8 байт вместо 16 на каждый объект. +- icon: ⚡ + title: Лучшее использование кэша + desc: Больше объектов помещается в строки кэша процессора. +- icon: 📊 + title: Более высокая плотность + desc: Больше объектов в том же объёме кучи. +support: + description: Финализировано в JDK 25 LTS (JEP 519, сентябрь 2025). diff --git a/translations/content/ru/tooling/jfr-profiling.yaml b/translations/content/ru/tooling/jfr-profiling.yaml new file mode 100644 index 0000000..36f2d92 --- /dev/null +++ b/translations/content/ru/tooling/jfr-profiling.yaml @@ -0,0 +1,23 @@ +title: JFR для профилирования +oldApproach: Внешний профилировщик +modernApproach: Java Flight Recorder +summary: Профилирование любого Java-приложения встроенным Flight Recorder — без + внешних инструментов. +explanation: Java Flight Recorder (JFR) — инструмент профилирования, встроенный + в JVM с минимальными накладными расходами. Он фиксирует события CPU, памяти, + GC, ввода-вывода, потоков и пользовательские события с минимальным влиянием + на производительность (~1%). +whyModernWins: +- icon: 🆓 + title: Встроен + desc: Никаких внешних профилировщиков для установки или лицензирования. +- icon: ⚡ + title: Минимальные накладные расходы + desc: "~1\u202F% влияния на производительность — безопасно для использования\ + \ в продакшене." +- icon: 📊 + title: Богатый набор событий + desc: "CPU, память, GC, потоки, ввод-вывод, блокировки и пользовательские\ + \ события." +support: + description: Широко доступно начиная с JDK 9/11 (открытый исходный код с версии 11) diff --git a/translations/content/ru/tooling/jshell-prototyping.yaml b/translations/content/ru/tooling/jshell-prototyping.yaml new file mode 100644 index 0000000..306226d --- /dev/null +++ b/translations/content/ru/tooling/jshell-prototyping.yaml @@ -0,0 +1,20 @@ +title: JShell для прототипирования +oldApproach: Создать файл + скомпилировать + запустить +modernApproach: REPL JShell +summary: Интерактивное тестирование выражений Java без создания файлов. +explanation: JShell — это цикл чтения-вычисления-вывода (REPL) для Java. Тестируйте + выражения, исследуйте API и прототипируйте код, не создавая файлы, не компилируя + и не пишу метод main. Автодополнение по Tab и контекстная документация уже + включены. +whyModernWins: +- icon: ⚡ + title: Мгновенная обратная связь + desc: Введите выражение и сразу увидите результат. +- icon: 📝 + title: Файлы не нужны + desc: Никаких .java-файлов, никакого шага компиляции. +- icon: 🔍 + title: Изучение API + desc: Автодополнение по Tab помогает обнаруживать методы и параметры. +support: + description: Широко доступно начиная с JDK 9 (сентябрь 2017) diff --git a/translations/content/ru/tooling/junit6-with-jspecify.yaml b/translations/content/ru/tooling/junit6-with-jspecify.yaml new file mode 100644 index 0000000..a41a863 --- /dev/null +++ b/translations/content/ru/tooling/junit6-with-jspecify.yaml @@ -0,0 +1,29 @@ +title: JUnit 6 с типобезопасностью JSpecify по null +oldApproach: API без аннотаций +modernApproach: "@NullMarked API" +summary: "JUnit 6 принимает @NullMarked из JSpecify, делая null-контракты явными\ + \ во всём Assertion API." +explanation: "JUnit 5 поставлялся без стандартизированных аннотаций допустимости null,\ + \ поэтому разработчики вынуждены были догадываться, могут ли параметры или\ + \ возвращаемые значения методов утверждения быть null. JUnit 6 принимает JSpecify\ + \ для всего своего модуля: аннотация @NullMarked делает все неаннотированные\ + \ типы ненулевыми по умолчанию, а @Nullable отмечает исключения. Класс Assertions\ + \ явно аннотирует параметры — например, assertNull(@Nullable Object actual) и\ + \ fail(@Nullable String message), — благодаря чему IDE и статические анализаторы,\ + \ такие как NullAway и Error Prone, могут обнаруживать ошибки работы с null во\ + \ время компиляции, а не во время выполнения." +whyModernWins: +- icon: 📜 + title: Явные контракты + desc: "@NullMarked в модуле JUnit 6 документирует семантику null прямо в API\ + \ — читать исходный код не нужно." +- icon: 🛡️ + title: Безопасность на этапе компиляции + desc: IDE и анализаторы предупреждают при передаче null туда, где ожидается + ненулевое значение, выявляя ошибки до запуска тестов. +- icon: 🌐 + title: Стандарт экосистемы + desc: JSpecify принят Spring, Guava и другими библиотеками — единая семантика + null во всём стеке. +support: + description: Доступно начиная с JUnit 6.0 (октябрь 2025, требуется Java 17+) diff --git a/translations/content/ru/tooling/multi-file-source.yaml b/translations/content/ru/tooling/multi-file-source.yaml new file mode 100644 index 0000000..63e63cd --- /dev/null +++ b/translations/content/ru/tooling/multi-file-source.yaml @@ -0,0 +1,19 @@ +title: Запуск многофайлового исходного кода +oldApproach: Сначала скомпилировать всё +modernApproach: Запуск исходного кода +summary: Запуск многофайловых программ без явного шага компиляции. +explanation: Java 22+ может автоматически компилировать при запуске связанные + исходные файлы из .java-файла. Это делает небольшие многофайловые программы + такими же простыми в запуске, как скрипты, без необходимости в Maven или Gradle. +whyModernWins: +- icon: 🚀 + title: Никакой настройки + desc: Инструменты сборки для небольших многофайловых программ не нужны. +- icon: 🔗 + title: Автоматическое разрешение зависимостей + desc: Используемые классы находятся и компилируются автоматически. +- icon: 📝 + title: Похоже на скрипт + desc: Запускайте многофайловые программы как скрипты. +support: + description: Доступно начиная с JDK 22 (март 2024) diff --git a/translations/content/ru/tooling/single-file-execution.yaml b/translations/content/ru/tooling/single-file-execution.yaml new file mode 100644 index 0000000..812e156 --- /dev/null +++ b/translations/content/ru/tooling/single-file-execution.yaml @@ -0,0 +1,20 @@ +title: Выполнение однофайловых программ +oldApproach: Двухэтапная компиляция +modernApproach: Прямой запуск +summary: Запуск однофайловых Java-программ напрямую без javac. +explanation: Лаунчер Java может скомпилировать и выполнить один исходный файл + одной командой. В сочетании с поддержкой shebang в Unix Java-файлы могут + работать как скрипты. Отдельный шаг компиляции не нужен. +whyModernWins: +- icon: ⚡ + title: Одна команда + desc: "java File.java компилирует и выполняет за один шаг." +- icon: 📝 + title: Похоже на скрипт + desc: Добавьте строку shebang, чтобы превратить .java-файлы в исполняемые + скрипты. +- icon: 🎓 + title: Удобно для обучения + desc: Новички могут сразу запускать код, не изучая инструменты сборки. +support: + description: Широко доступно начиная с JDK 11 (сентябрь 2018) diff --git a/translations/content/tr/collections/copying-collections-immutably.yaml b/translations/content/tr/collections/copying-collections-immutably.yaml index a38954b..58e0c67 100644 --- a/translations/content/tr/collections/copying-collections-immutably.yaml +++ b/translations/content/tr/collections/copying-collections-immutably.yaml @@ -12,7 +12,7 @@ whyModernWins: title: "Tek çağrı" desc: "Elle ArrayList oluşturma ve sarmalama gerekmez." - icon: "🛡️" - title: "Savunmacı kopya" - desc: "Orijinaldeki değişiklikler kopyayı etkilemez." + title: "Her Collection" + desc: "Herhangi bir Collection'ı girdi olarak kabul eder—ara ArrayList dönüşümü gerekmez." support: description: JDK 10'dan itibaren geniş çapta kullanılabilir (Mart 2018) diff --git a/translations/content/tr/collections/stream-toarray-typed.yaml b/translations/content/tr/collections/stream-toarray-typed.yaml index 6486725..1c11267 100644 --- a/translations/content/tr/collections/stream-toarray-typed.yaml +++ b/translations/content/tr/collections/stream-toarray-typed.yaml @@ -1,6 +1,6 @@ --- title: Tiplendirilmiş stream toArray -oldApproach: Elle Dizi Kopyalama +oldApproach: Elle Filtreleme + Kopyalama modernApproach: toArray(generator) summary: "Stream'leri metot referansıyla tiplendirilmiş dizilere dönüştürün." explanation: "toArray(IntFunction) metodu, bir stream'den düzgün tiplendirilmiş bir dizi oluşturur. Üretici (String[]::new), stream'e hangi türde dizi oluşturacağını söyler." diff --git a/translations/content/zh-CN/collections/copying-collections-immutably.yaml b/translations/content/zh-CN/collections/copying-collections-immutably.yaml index f4f81a6..6f51120 100644 --- a/translations/content/zh-CN/collections/copying-collections-immutably.yaml +++ b/translations/content/zh-CN/collections/copying-collections-immutably.yaml @@ -12,7 +12,7 @@ whyModernWins: title: 真正不可变 desc: "结果集合结构上不可修改。" - icon: 📏 - title: 简洁 - desc: "一行代码替代多行手动复制和包装。" + title: 支持任意 Collection + desc: "接受任意 Collection 作为输入,无需中间转换为 ArrayList。" support: description: 自 JDK 10 起广泛可用(2018 年 3 月) diff --git a/translations/content/zh-CN/collections/stream-toarray-typed.yaml b/translations/content/zh-CN/collections/stream-toarray-typed.yaml index 66471fe..dab29dd 100644 --- a/translations/content/zh-CN/collections/stream-toarray-typed.yaml +++ b/translations/content/zh-CN/collections/stream-toarray-typed.yaml @@ -1,6 +1,6 @@ --- title: 类型化流 toArray -oldApproach: 手动数组复制 +oldApproach: 手动过滤 + 复制 modernApproach: toArray(generator) summary: "使用方法引用将流转换为类型化数组。" explanation: "toArray(IntFunction) 方法从流创建正确类型化的数组。传递 String[]::new 获取 String[],而非 Object[]。" diff --git a/translations/strings/ru.yaml b/translations/strings/ru.yaml new file mode 100644 index 0000000..98765b1 --- /dev/null +++ b/translations/strings/ru.yaml @@ -0,0 +1,95 @@ +site: + title: java.evolved + tagline: Java эволюционировал. Ваш код тоже может. + tagline_line1: Java эволюционировал. + tagline_line2: Ваш код тоже может. + description: Коллекция современных фрагментов кода на Java. Каждый устаревший шаблон + рядом с его чистой, современной заменой — бок о бок. + heroSnippetCount: ✦ {{snippetCount}} современных шаблонов · Java 8 → Java 25 + heroOld: Старый + heroModern: Современный + allComparisons: Все сравнения + snippetsBadge: '{{snippetCount}} сниппетов' +nav: + allPatterns: ← Все шаблоны + toggleTheme: Переключить тему + viewOnGitHub: Посмотреть на GitHub + selectLanguage: Выбрать язык +breadcrumb: + home: Главная +sections: + codeComparison: Сравнение кода + whyModernWins: Почему современный подход лучше + oldApproach: Старый подход + modernApproach: Современный подход + sinceJdk: Начиная с JDK + difficulty: Сложность + jdkSupport: Поддержка JDK + howItWorks: Как это работает + relatedDocs: Связанная документация + proof: Доказательство + proofLink: Посмотреть исходник доказательства + relatedPatterns: Похожие шаблоны +filters: + show: 'Показать:' + all: Все + jdk: 'JDK:' + category: 'Категория:' + noResults: Шаблоны кода для этого фильтра не найдены. +difficulty: + beginner: Начинающий + intermediate: Средний + advanced: Продвинутый +search: + placeholder: Поиск сниппетов… + noResults: Результаты не найдены. + esc: ESC + searchTrigger: Поиск… + navigate: навигация + open: открыть + close: закрыть +cards: + old: Старый + modern: Современный + hoverHint: наведите, чтобы увидеть современный → + hoverHintRelated: Наведите, чтобы увидеть современный ➜ + touchHint: 👆 нажмите или смахните → + learnMore: подробнее +copy: + copy: Копировать + copied: Скопировано! +share: + label: Поделиться +view: + expandAll: Развернуть все + collapseAll: Свернуть все +stats: + modernPatterns: Современных шаблонов + jdkVersions: Охваченных версий JDK + categories: Категорий + linesOfPython: Строк Python кода понадобилось бы +footer: + tagline: Java эволюционировал. Ваш код тоже может. + madeWith: Сделано с ❤️ + and: и + inspiredBy: Вдохновлено + viewOnGitHub: Посмотреть на GitHub +copilot: + headline: Модернизируйте вашу кодовую базу Java с GitHub Copilot. + description: Позвольте Copilot помочь вам перенести устаревшие шаблоны на современный Java — автоматически. + appModernization: Модернизация приложений → + javaGuide: Руководство по Java → +support: + available: Доступно + preview: Предварительный просмотр + experimental: Экспериментально +contribute: + button: Внести вклад + codeIssue: Сообщить о проблеме в коде + translationIssue: Сообщить о проблеме с переводом + suggestPattern: Предложить новый шаблон + seeIssue: "Заметили проблему в этом коде?" + reportIt: "Сообщите нам." +untranslated: + notice: Эта страница ещё не переведена на {{localeName}}. + viewInEnglish: Просмотреть на английском