Обобщения java против динамически загружаемого класса с использованием Class.forName()
Предположим, я делаю урок под названием правительство. У правительства есть такие члены, как офицеры, министры, департаменты и т. Д. Для каждого из этих членов я создаю интерфейс, и любое конкретное правительство определяет их по своему усмотрению.
Основной метод в классе правительства называется Serve(Request req)
, Предположим, что частота запросов очень велика (1000+ запросов в секунду).
Чтобы создать правительство, я могу:
1) Используйте дженерики Java для написания Government<Class Minister, Class Officer, ...>
и любая конкретная реализация правительства должна создать свой собственный объект правительства в коде Java, и main()
иметь развертываемую банку.
2) Иметь файл конфигурации, в котором указываются имена классов офицеров, министров и т. Д., И всякий раз, когда Serve()
называется, он использует Class.forName()
а также Class.newInstance()
создать объект класса. Любое новое правительство просто должно написать классы для своих членов и файл конфигурации. Есть один main()
для всех правительств.
С чисто эксплуатационной точки зрения - что лучше и почему? Мои основные проблемы:
а) делает forName()
выполнять дорогостоящий поиск каждый раз? Предположим, очень большая вселенная классов.
б) Нам не хватает оптимизаций компилятора, которые могут быть выполнены в случае 1, но не в случае 2 для динамических классов?
3 ответа
Пока вы повторно используете свой правительственный объект, во время выполнения нет никакой разницы. Разница только во время создания объекта.
Концепции 1 и 2 отличаются друг от друга - 1 является жестко запрограммированным, а 2 динамическим (вы можете даже использовать DI-ограничители, такие как пружина, guice или pico - в основном вы предлагали написать свой собственный)
Что касается производительности forName() - она зависит от загрузчика классов (а также от контейнера) . Большинство из них будут кэшировать результаты разрешения имен, искать в карте - но я не могу говорить за всех
Что касается оптимизаций - есть оптимизация компилятора, а также агрессивная оптимизация времени выполнения от JIT-компиляторов - они имеют большее значение.
Ваше описание для меня звучит примерно так: "Я хочу использовать инъекцию зависимостей, я должен свернуть свое собственное?"
Посмотрите на весну (или Guice от Google). Я приму весну.
Создайте интерфейсы для вещей и настройте, какую реализацию использовать для каждого в Spring.
Я не понимаю Эти два не альтернативы; они в значительной степени ортогональны: Generics - это конструкция времени компиляции. Он стирается и ни к чему не приводит во время выполнения. С другой стороны, загрузка классов с помощью вызова forName
это вещь во время выполнения. Одно не влияет на другое.
Если вы используете дженерики, то это означает, что вам не нужен объект класса во время выполнения, поскольку в дженериках у вас нет доступа к объекту класса, если вы не передаете его явно. Если вам не нужен объект класса во время выполнения, это означает, что вам не нужно загружать его с forName
так что это не согласуется с forName
, Если вы передаете объект класса явно, то это означает, что у вас уже есть объект класса, и вам не нужно его загружать, что также несовместимо с forName
,