Обобщения 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,

Другие вопросы по тегам