✅ Компактные файлы исходных кодов в Java 25
С релизом JDK 25, который произойдёт уже на следующей неделе - 16 сентября, стабильными станут компактные файлы исходных кодов и главные методы (JEP 512), которые были в разработке начиная с JDK 21. Все мы знаем, что любая программа, написанная на языке программирования Java, начинает выполнение с класса с main-методом, который в общих чертах имеет следующую форму:
class Application {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}И у людей, только начинающих изучение языка программирования Java, возникает сразу много вопросов: "А что такое класс и зачем он нужен?", "Зачем все эти public static void?" и т.д. И ведь во многих других языках программирования для обычного "Hello world" действительно нужно меньше действий.
Вот пример на Kotlin:
fun main() {
println("Hello world!")
}А вот пример на Rust:
fn main() {
println!("Hello world!");
}С релизом Java 25 можно будет убрать класс, модификаторы public и static, а так же аргументы:
void main() {
IO.println("Hello world!");
}В этом случае class и package объявляются неявно, и если файл Application.java с main-методом находится в пакете example, то описанный выше код будет эквивалентен следующему:
package example;
public class Application {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}Кроме этого в компактных файлах исходных кодов автоматически импортируются все публичные классы из пакетов, экспортируемых из модуля java.base, что значительно упрощает написание простых программ:
void main() {
Function<Integer, String> intToStringFunction = Object::toString;
Predicate<Integer> isEvenPredicate = i -> i % 2 == 0;
List<String> numbers = Stream.of(1,2,3,4,5,6)
.filter(isEvenPredicate)
.map(intToStringFunction)
.toList();
IO.println("Numbers are: " + numbers);// Numbers are: [2, 4, 6]
}Так же компактный файл исходных кодов кроме метода main может содержать другие методы и свойства класса и экземпляра:
static final String NUMBERS_ARE = "Numbers are: ";
void main() {
Function<Integer, String> intToStringFunction = Object::toString;
List<String> numbers = Stream.of(1, 2, 3, 4, 5, 6)
.filter(this::isEven)
.map(intToStringFunction)
.toList();
IO.println(NUMBERS_ARE + numbers);// Numbers are: [2, 4, 6]
}
private boolean isEven(Integer number) {
return number % 2 == 0;
}Но вместе с этим изменилась и минимальная сигнатура полноценного класса с main-методом, и теперь она выглядит следующим образом:
package example;
class Application {
static void main() {
}
}