Запуск .java файла в режиме Single-File Source-Code и иморт классов
Решаю задание с такими формулироваками для Java 21:
- В данном задании важно показать понимание ООП, умение строить модели (выделять классы, интерфейсы, их связи), разделять функционал между ними
- Все классы должны быть в пакете src/main/java/ru/organisation/check
- main-класс: ./src/main/java/ru/organisation/check/CheckRunner.java
- Приложение должно запускаться с помощью консольной команды: java -cp src ./src/main/java/ru/organisation/check/CheckRunner.java id-quantity discountCard=xxxx balanceDebitCard=xxxx
Насколько я понимаю запуск в режиме java FileName.java имеет следующие особенности:
- Java сама найдет точку входа
- Это аналогично компиляции в память
- Файл может содержать много классов
- В cp не должно быть скомпилированной версии главного класса
- Все зависимости в виде .jar или .class должны лежать в cp
Но тогда от меня ускользает смысл такого типа запуска. С одной стороны хотят посмотреть умение проектировать, с другой надо бы все классы и интерфейсы сложить огромной кучей в один файл. Или скомилировать. Но без main класса, тогда почему бы и его не скомилировать тоже.
Я что-то упускаю? Что-то просмотрел?
Ответы (1 шт):
Сложно сказать, что именно хотят проверить в задаче. Чем отличается компиляция от интерпретации? По сути это аналогия запуска скрипта, но на Java: JEP 330: Launch Single-File Source-Code Programs
По вашим пунктам:
Java сама найдет точку входа
Не совсем. Точкой входа всегда является public static void main(String[] args)
. Когда вы пишите:
./src/main/java/ru/organisation/check/CheckRunner.java
Вы указываете в каком именно классе искать main
.
В Java 21 можно написать void main() {}
без указания класса.
Это аналогично компиляции в память.
Да, это пропуск шага сохранения скомпилированного .class
файла на файловую систему. Этот файл существует только в оперативной памяти (по сути кэш).
Файл может содержать много классов
Да это так. По аналогии и с другими интерпретируемыми языками (JavaScript, Python и др).
В cp не должно быть скомпилированной версии главного класса.
Да. Это логично, так как коллизий имён (пространства имён) быть не должно.
Все зависимости в виде .jar или .class должны лежать в cp
Да. Если вы хотите использовать заранее скомпилированные (например внешние) библиотеки, вы должны их предоставить в момент запуска скрипта.
ИМХО: Проверяющие хотят иметь простой способ запуска и проверки вашего проекта, без лишних телодвижений. Сначала проверят работоспособность, а затем код (а он лежит в одном файле, что удобно).
Ещё варианты:
- у них есть автоматический тестовый скрипт, который проверяет вашу программу.
- у них есть автоматический скрипт, который оценит ваш код.
- они отправят ваш код в чат нейросети для оценки