我有一个java类,其中有4个地图。我希望所有的Map都是单例的,下面的方法是最好的。如果有其他更好的方法,请建议
- 使类成为单例并保留变量。也就是将构造函数设为私有并创建getInstance方法。
- 将类设置为单例,并将变量设置为静态。这就是将构造函数设为私有并创建getInstance方法。使所有处理这4个地图的方法都是静态的
- 使类为单例,变量为静态,并使每个getmethod检查map是否为空/大小为零,如果它为空/大小为零,调用initialize方法将初始化所有四个map。这里的问题是4个映射将有4个get方法我们需要在initialize方法上调用synchronized>
首先我推荐阅读这个问题(好吧,它的答案):单例模式的缺点是什么?什么是依赖注入?
单例模式是关于对象存在于单个实例中,因此它可以在多个地方使用。问题不在于单例的概念,而在于如何频繁地实现它(通过一些静态访问的字段/方法)。
所以,你需要的是一个单例对象,但是没有上面提到的所有问题。
因此,在类(你想成为一个单例)中,只需将所有这些映射定义为普通字段,添加你需要的所有方法以及它的依赖项(应该通过构造函数注入)。
一旦定义了这个类,你只需要:
- 创建单个对象
- 在创建对象时将其提供给需要访问它的其他对象(理想情况下通过它们的构造函数或setter方法)。
如何实现以上两点取决于您的应用程序。你基本上需要一个依赖注入系统。
- 你可以手动实现它,这基本上意味着有一个工厂方法来创建所有的单例对象并将它们连接在一起)。
- 如果你使用spring,那么你可以依赖它的依赖注入功能(在这种情况下,你只需要用
@Component
注释你的单例,然后用@Autowired
注入到其他组件)。 - 你甚至可以自己设置依赖注入,例如https://github.com/google/guice
然而,如果这是你第一次接触依赖注入的概念。我建议手动实现它,这样你就能更好地理解上面提到的依赖注入框架是如何工作的。