Внедрение зависимостей в API коллекций Java - PullRequest
2 голосов
/ 20 сентября 2011

Я пишу Java-компонент, который будет выполнять довольно тяжелую работу с некоторыми большими данными. Следовательно, эффективность (как скорость, так и память) имеет первостепенное значение.

Я также только начинаю работать с IoC и платформами внедрения зависимостей (такими как Spring AOP, Google Guice и т. Д.), И мне было интересно, могут ли они вообще помочь мне.

Я хотел бы сделать что-то вроде этого (все в моем коде):

List<MyData> oMyData = new List<MyData>();

Затем, в каком-то XML-файле конфигурации (или, тем не менее, платформа настраивает инъекции), я бы указал, что каждый раз, когда создается экземпляр List, для внедрения, скажем, ArrayList<MyData> в качестве его реализации.

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

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

Заранее спасибо за любые идеи или рекомендации!

Ответы [ 4 ]

3 голосов
/ 20 сентября 2011

Это не похоже на классический сценарий для контейнера IOC, но вы можете использовать фабричный метод.

public static List<MyData> createDataList(){
    return new ArrayList<MyData>();
}

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

Просто чтобы прояснить: МОК - это потрясающая концепция.Но я не думаю, что вы говорите о классическом сценарии для МОК.

1 голос
/ 20 сентября 2011

Это то, что вы ищете?

<util:list list-class="java.util.ArrayList" value-type="your.package.YourClass">
    <!-- list elements here -->
</util:list>

Это поставляется из коробки с пружиной ...

0 голосов
/ 09 декабря 2012

Как уже говорилось, описание вашего случая несколько необычно для решения DI. Особенно настраивать таким образом швы несколько неуместно. Я подозреваю, что для достижения успеха вам даже потребуется более одной реализации для разных мест внедрения. Если вы хотите пойти на это, я рекомендую использовать Silk DI . Он позволяет связывать разные реализации List при разных обстоятельствах http://www.silkdi.com/userguide/binds.html#targeting с помощью всего нескольких привязок.

0 голосов
/ 20 сентября 2011

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

Вы можете использовать Spring для этого.Конечно, точный синтаксис внедрения объекта будет сильно отличаться от того, что вы здесь показываете.

В Spring, например, вы бы написали

List<MyData> oMyData = factory.getBean("MyData")

В отдельном конфигурационном файле вы точно указываете, что такое MyData, и это будет введено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...