Java在不使用静态的情况下跨其他对象共享对象的最佳方法

时间:2015-02-10 15:56:06

标签: java

我有一个实例化类B的类A,它反过来对C类做同样的事情,形成一棵大树。我现在需要实例化一个应该在整个树中都可用的对象,并且我不想在所有类中手动单独注入该对象。我不想使用静态,因为可能有不同的A类实例在不同的线程中并发运行,并且每个线程的共享对象必须是唯一的。我对线程安全操作没有多少经验。

3 个答案:

答案 0 :(得分:1)

使用Spring来管理实例。这样你就可以将你的实例注入到需要它的任何类中,如果父类的创建是spring管理的,那么注入的bean将被填充。

更详细地说,你可以做的是定义一个类。

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

确保Springscanning its package,或者您已在applicationContext.xml文件中定义了此类this。下一阶段是使用inject注释@Autowired您需要的bean。

@Autowired
private MyBean myBean;

在创建该类时,myBean将填充最初创建的MyBean的相同实例。

<强>优点

  • 这样做意味着您的解决方案可以很好地扩展。您可以将其注入任何地方而无需不断更改构造函数(当您在类之间创建越来越多的子类和关系时,这是Shotgun Surgery的主要候选者。

  • 了解行业中使用的技术总是很好。

  • 使用其他方法(如Singleton模式)管理类的单个实例通常是个坏主意。

<强>缺点

  • Spring除了注入对象之外还做了很多事情,而且你正在拉下很多类来做这件事,这会增加你的解决方案的规模,尽管不是很明显。

额外阅读

答案 1 :(得分:0)

您需要在要使用该对象的上下文中使用本地引用,或者您需要静态引用。由于您不想使用静态,因此需要获取本地引用。您可以通过在构造函数中传递对象或添加setter方法来完成此操作。然后在树中向上构建您在所需对象中传递的子节点。

答案 2 :(得分:0)

你可以拥有一种&#34; Parallel Singleton&#34;所以说,也就是说,在一个以线程相关对象为关键字的哈希映射中,它不会只有一个实例,而是保留与线程一样多的实例。