Найти в Дзене

Компактные файлы исходных кодов в JDK 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 mai
JDK 25
JDK 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 pro.akosarev.sandbox;

class Application {
static void main() {
}
}