15 октября 2025
Тэги: Java.
Java 25 принесла нам такие фичи как Compact Sources и Instance Main Methods (JEP 512). Теперь мы можем писать на Java как на скриптовом языке: без создания классов, без модификаторов доступа и без явных импортов. Это значительно снижает порог входа для новичков, ведь раньше нужно было объяснять что такое класс, что такое public, static, маccив строк.
Сравните, как выглядела самая простая программа до Java 25:
И как выглядит её эквивалент теперь:
Теперь фиктивная обёртка в виде класса становится необязательной, а System.out получил компактный алиас в виде IO.
На уровне компилятора тут никакой магии нет. Наши методы всё так же оборачиваются в некий класс. При этом имя такого класса удаляется из таблицы символов, чтобы нельзя было его создать с помощью new. То есть для программиста такой класс-обёртка недоступен.
Также необходимо дополнить, что сейчас не обязательно компилировать программу с помощью javac. Мы можем запускать исходники прямо из командной строки. Эта возможность появилась уже довольно давно, ещё в Java 10.
Отсюда кстати следует интересный вывод, что для запуска скрипта на java вам даже не нужен JDK со средствами компиляции, достаточно JRE.
Для упрощения работы с консолью у нас появился новый класс IO, который оборачивает некоторые методы из System.out и System.in. Он содержит всего пять методов:
Наверняка вы помните, что считать строку из консоли в Java было чуть сложнее, чем вывести её на экран. Теперь всё это в прошлом.
Поскольку класс IO находится в пакете java.lang, то импортировать его в явном виде не требуется. Однако Compact Source файл должен находится в корневом пакете (т.е. в папке src). Это позволяет нам избавиться от объявления package.
Теперь давайте рассмотрим несколько примеров.
Допустим, я сначала хочу запросить имя у пользователя, чтобы затем его поприветствовать:
Ничто не мешает мне создавать другие методы в этом же файле:
Как и раньше, я могу передать параметры из командной строки как параметры метода main:
Тогда при вызове программы из консоли я могу перечислить все параметры метода через пробел:
Я могу использовать не только методы из текущего файла, но и соседние классы, если они лежат в той же папке src.
Никаких импортов.
Вводом-выводом дело не ограничивается. В скоупе Compact Source мне также доступны все стандартные классы и коллекции (List, Set, Map) без явного импорта.
Разработчики Java уже давно взяли курс на сокращение boiler plate кода, последовательно вводя лямбды, стримы, var, List.of(), record и т.п.
Кульминацией этого движения теперь становятся Compact Source файлы, которые значительно упрощают демонстрацию примеров и написание скриптов. Пожалуй, я и сам буду теперь активно этим пользоваться.
Kotlin, Java, Spring, Spring Boot, Spring Data, Spring AI, SQL, PostgreSQL, Oracle, H2, Linux, Hibernate, Collections, Stream API, многопоточность, чат-боты, нейросети, файлы, devops, Docker, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.