Я тоже заметил, что можно исполнять файл с несколькими публичными классами. Но так и не понял, зачем это нужно. Если файл один, то всё и так находится в одном пакете, и public/не-public уже не имеет значения.
Первый раз слышу, чтобы Eclipse позволял перезагружать плагины без перезагрузки. Любая установка плагинов / обновление Eclipse показывает окно с просьбой перезагрузки.
В случае плагина в отдельном jar все равно все так и будет
Почему? ClassLoader в джаве грузит классы лениво, в момент первого обращения к ним. В джарке могут быть сотни классов и далеко не все из них понадобятся. Например, пользователь вообще не будет трогать те или иные кнопки, и тогда получается, что вы зря грузили все эти лишние классы.
Выгрузить класс может только сборщик мусора, если класс станет недостижимым. Это значит, что не должно быть ни одной цепочки сильных ссылок от GC roots до любого объекта этого класса + не должно быть цепочек ссылок на сам этот класс. Но даже если вы всё это проконтролируете, то всё равно не сможете положиться на немедленную выгрузку классов, так как сборщик мусора собирает мусор непредсказуемо. Это значит, что какое-то время эти классы будут висеть в metaspace и занимать место.
Загружать новые версии плагинов можно, и я даже встречал людей, которые утверждали, что это делают, но я считаю, что геморрой от этого превышает пользу. (Это всё моё личное мнение)
Не совсем понимаю, как URLClassLoader поможет вам найти нужные реализации сервисов. Загрузчик классов может только загружать классы и всё. Будете грузить вообще все классы, которые есть, а потом через reflection искать нужные? У вас приложение будет стартовать по 10 минут.
Вот только вам придётся для этого прописывать все свои реализации сервисов в `META-INF/services/`. Это большой геморрой, особенно когда точек расширений у вас очень много. Спасибо, но это слишком неудобно. Использовать module-info.java гораздо проще и надёжнее.
Идея classpath проще и универсальней.
Проще, но с ней вы теряете инкапсуляцию и надёжность графа зависимостей. Если у вас есть какая-нибудь ошибка вроде цикла или split-пакетов, то classpath вам ничего об этом не скажет.
Используется, и ни в каких-нибудь, а в Спринге! А как вы думаете там работают всякие автофигурации, когда вам достаточно просто навесить аннотации на типы, а Спринг сам просканирует classpath и найдёт их? Как вы это предлагаете делать без парсинга байткода? Если у вас нет XML-конфигурации, то список классов заранее неизвестен, и Спрингу придётся пропарсить классы, чтобы понять, какие именно нужны.
Хорошее обсуждение, которое полностью основано на личных мнениях людей. «Я предпочитаю», «Я думаю» и всё в таком духе. Совершенно правильно, что вопрос закрыли.
Напомните, в какой официальной конвенции именования запрещены префиксы I? Требуется лишь только, чтобы имена типов были camel case и начинались с заглавной буквы. Про I там ничего не сказано.
Не знал, что System.out.println это цикл
try-with-resources
тоже неявноfinal
.Загружать новые версии плагинов можно, и я даже встречал людей, которые утверждали, что это делают, но я считаю, что геморрой от этого превышает пользу.
(Это всё моё личное мнение)
Проще, но с ней вы теряете инкапсуляцию и надёжность графа зависимостей. Если у вас есть какая-нибудь ошибка вроде цикла или split-пакетов, то classpath вам ничего об этом не скажет.