Java лучший способ поделиться объектом между другими объектами без использования статического

1

У меня есть класс A, который создает экземпляр класса B, который в свою очередь делает то же самое для класса C и т.д., Образуя большое дерево. Теперь мне нужно создать экземпляр объекта, который должен быть доступен по всему дереву, и я не хочу, чтобы индивидуально вводить этот объект вручную во всех классах. Я не хочу использовать статический, потому что могут быть разные экземпляры класса A, выполняемые одновременно в разных потоках, и этот общий объект должен быть уникальным для каждого потока. У меня нет большого опыта работы с потокобезопасными операциями.

  • 4
    Вы смотрели на ThreadLocal ?
  • 2
    Слышали ли вы о структурах внедрения зависимостей, таких как Spring / Guice?
Показать ещё 1 комментарий
Теги:

3 ответа

1
Лучший ответ

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

Более подробно, что вы можете сделать, это определить класс.

public class MyBean {
    // Add your class details.
}

И убедитесь, что Spring либо сканирует свой пакет, либо вы определили bean-компонент в файле applicationContext.xml как это. Следующий этап - inject этот компонент, где вам нужно, используя @Autowired аннотацию.

@Autowired
private MyBean myBean;

И при создании этого класса myBean будет заполнен тем же экземпляром MyBean который был изначально создан.

преимущества

  • Выполнение этого способа означает, что ваше решение хорошо масштабируется. Вы можете вводить его в любом месте без постоянно меняющихся конструкторов (и когда вы создаете все больше и больше подклассов и отношений между классами, это главный кандидат на хирургию стрельбы.

  • Всегда полезно узнать о тех технологиях, которые используются в промышленности.

  • Управление одним экземпляром класса с использованием других методов (например, шаблона Singleton) обычно является плохой идеей.

Недостатки

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

Дополнительное чтение

  • Взгляните на основной учебник по весне, чтобы вы начали.

  • Посмотрите на различные области, с которыми вы можете создавать бобы, в случае, если некоторые из них лучше подходят вашим потребностям.

0

Вам либо нужна локальная ссылка в контексте, который вы хотите использовать, либо вам нужна статическая ссылка. Поскольку вы не хотите использовать static, вам нужно получить локальную ссылку. Вы можете сделать это, передав объект в конструкторе или добавив метод setter. Затем выше дерево, где вы строите дочерний узел, который вы передаете в нужном объекте.

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню