Одноклассовые программы станут намного проще

Java известен (и часто критикуется) за огромное количество необходимых шаблонов и церемоний для предполагаемых мирских задач, по крайней мере, по сравнению с другими языками. Несмотря на то, что «война с шаблонами» не является основной целью большинства новых функций, она часто является побочным эффектом новых дополнений к языку, таких как Records. Предварительная версия JEP 445, однако, явно нацелена на то, чтобы сделать первое знакомство с Java легким и легким: более простые основные методы и безымянные классы.

Более простые основные методы

Несмотря на то, что Java — отличный язык для сложных, больших приложений корпоративного уровня с несколькими разработчиками, он также должен быть первым языком программирования. Вот почему начальные препятствия должны быть как можно ниже.

Давайте посмотрим, как написать свою первую программу на Java.

Как запустить (Java) программу

Мы все знаем, как начинается типичная программа Java:

package com.beliefdrivendesign;

public class MyAwesomeApp {

  public static void main(String... args) {
    // Awesome code goes here
  }
}

Это «нормальная» точка входа, которую все мы писали много раз, а в сложных приложениях мы делаем это один раз и больше об этом не задумываемся. Но представьте, что вы снова новичок и хотите изучать Java. Вы еще мало знаете о Java и сейчас сталкиваетесь со многими вещами…

Объявление package, которое может быть, а может и нет.

Объявление class использует обязательный модификатор видимости (public), который не имеет смысла для нашей первой программы. И если вы назовете файл, содержащий его, не таким, как class, он не скомпилируется.

Далее идет метод с метким названием main, так что это фактическая точка входа. Тем не менее, он также использует модификатор видимости (public), но добавляет модификатор времени жизни/доступа (static) на всякий случай. Чтобы еще больше усложнить задачу, давайте введем переменные-аргументы (String...) или массив (String[]) прямо в вашу первую программу.

Я буду использовать var-args на протяжении всей статьи, но это взаимозаменяемо с массивом.

Большинству из этих функций вам нужно научиться в какой-то момент, но они в первую очередь предназначены для более сложных приложений. Не зная подробностей об этих функциях, вы можете подумать, что static методов — это то, что нужно, и с самого начала сформировать плохую привычку.

Сравните все это с требованиями к вашей первой программе на Python:

# Awesome code goes here

Это даже код вашей первой программы на Ruby!

Так что я думаю, что это прекрасно иллюстрирует, что люди имеют в виду, когда говорят о церемониях и шаблонах. Для опытного разработчика и в контексте сложной программы это может иметь небольшое значение, и каждая из функций необходима и имеет смысл. Однако для новичков это ненужное препятствие по сравнению со многими другими языками.

Меньше - больше

Давайте еще раз рассмотрим пример с Java и удалим все «лишнее».

Объявление package не нужно даже до Java 21, поэтому оно опущено. Но как насчет удаления модификаторов видимости/времени жизни и аргументов метода?

class MyAwesomeApp {
  void main() {
    // Awesome code goes here
  }
}

Все еще не так гладко, как на других языках, но уже большое улучшение! И это именно то, что представит гибкий протокол запуска JEP 445:

  • Для объявления class модификатор видимости не требуется.
  • main механика поиска метода, поиск первой доступной точки входа:
  • Любой не-private static void main(String... args) метод
  • Любой не-private static void main() метод
  • Метод void main(String...)
  • Метод void main()

Благодаря тому, что мы убрали большую часть церемоний для одноклассовых программ, код стал не таким пугающим, как раньше, и у нас даже есть выбор вариантов!

Однако лучше всего то, что он реализован в Java-совместимом виде. Нет необходимости в специальном синтаксисе, это всего лишь действительный код.

Однако удаление модификаторов и аргументов метода — это еще не все, что содержит JEP 445.

Безымянные классы

Структура Java-проектов проста: каждый класс находится в пакете, а каждый пакет — в модуле. Этот метод пространства имен и разделения вашего кода распространен во многих языках программирования и необходим для любой программы, состоящей из нескольких классов. Однако, как и метод public static void main(String... args) в предыдущем разделе, это еще одно препятствие для простых одноклассовых программ.

Вот почему JEP 445 также вводит безымянные классы, еще больше упрощая наш код.

void main() {
  // Awesome code goes here
}

Изменение, которое делает это возможным, заключается в том, как компилятор обрабатывает источник с методами и полями, не включенными в класс. Любые незакрытые поля и методы, а также вложенные классы, объявленные в файле, создают безымянный класс верхнего уровня.

Поскольку у класса нет имени, мы не можем ссылаться на него или создавать его экземпляры самостоятельно. Он находится в безымянном пакете безымянного модуля. Кроме того, он ведет себя почти как «обычное» объявление класса. Однако мы не можем использовать определенные функции, такие как реализация интерфейса, расширение другого типа, обращение к классу по имени, создание документации с помощью javadoc и т. д.

Несмотря на то, что код больше не является допустимым синтаксисом Java на поверхности, он все еще остается за кулисами. Если в коде нет метода static main, выполнение

new Object() {
  void main() {
    // Awesome code goes here
  }
}.main();

Почему это важно

Как опытный разработчик с годами работы с Java, вы можете не понимать, почему это важно, тем более, что вам пришлось вытерпеть это и при этом стать потрясающим разработчиком Java. Тем не менее, как показывает этот JEP, Java предлагает новичкам многое, чего можно избежать.

Новичкам нужно сосредоточиться только на соответствующем коде для их первого контакта, поэтому отказ от понятий и конструкций, которые им не нужны немедленно, имеет большой смысл. Дело не в том, что им не нужно учить их в какой-то момент, но теперь они могут делать это в своем собственном темпе.

Хорошо, так почему бы не сделать это еще проще, полностью удалив метод main? Ну, потому что разработчики языка Java уделяют много внимания любому новому дополнению, особенно если оно затрагивает сам язык. Как я уже говорил в предыдущей статье, дизайн языка Java стремится к совершенствованию без компромиссов.

Удаление метода main и обработка всего кода так, как это повлияет на другую семантику Java, например, на то, как локальные переменные ведут себя иначе, чем поля. Во многих случаях это может не иметь большого значения, но помешает превратить безымянный класс в более крупную программу по мере вашего продвижения в обучении.

Должен ли я использовать функцию предварительного просмотра?

Поскольку обе функции, более простые основные методы и безымянные классы, относятся только к одноклассовым программам, я не вижу никакого вреда в их использовании.

Вы можете использовать функцию предварительного просмотра двумя способами:

Компиляция и запуск вашего кода

# COMPILE
javac --release 21 --enable-preview MyAwesomeApp.java

# RUN
java --enable-preview MyAwesomeApp

Использование средства запуска исходного кода (JEP 330)

java --source 21 --enable-preview MyAwesomeApp.java

Заинтересованы в использовании функциональных концепций и методов в коде Java? Ознакомьтесь с моей книгой Функциональный подход к Java!

Моя книга Функциональный подход к Java!

Ресурсы