好吧,我想知道我的应用程序在我的类中的状态之一。使用静态布尔变量还是使用具有 Getters 和 Setters 方法的 Singleton 类好。简要介绍该方法的优缺点。
4 回答
如果您将其设为静态以更改其他类的状态,则您已将其设为公开。静态变量的 getter 和 setter 也是没有意义的,因为它们是类变量。将变量公开也不是一个好的编程习惯。因此,更好的选择是拥有一个单例类并拥有状态变量的 getter 和 setter 方法。此外,如果您处于多线程环境中,请使变量 volatile 以进行正确同步。
实际上有很多充分的理由考虑使用访问器而不是直接公开类的字段——不仅仅是封装的论点和使未来的变化更容易。
以下是我知道的一些原因:
封装与获取或设置属性相关的行为——这允许以后更容易地添加附加功能(如验证)。
隐藏属性的内部表示,同时使用替代表示公开属性。
使您的公共接口免受更改 - 允许公共接口在实现更改时保持不变,而不会影响现有消费者。
控制属性的生命周期和内存管理(处置)语义 - 在非托管内存环境(如 C++ 或 Objective-C)中尤为重要。
为属性在运行时更改时提供调试拦截点 - 在某些语言中,如果没有此属性,调试属性更改为特定值的时间和地点可能会非常困难。
改进了与旨在针对属性 getter/setter 操作的库的互操作性 - 想到了模拟、序列化和 WPF。
允许继承者更改属性行为方式的语义,并通过覆盖 getter/setter 方法来公开。
允许 getter/setter 作为 lambda 表达式而不是值传递。
- getter 和 setter 可以允许不同的访问级别——例如 get 可能是公共的,但 set 可以是受保护的。
单例模式与静态类相比有几个优点。
- 单例可以扩展类和实现接口,而静态类不能(它可以扩展类,但不继承它们的实例成员)。
- 单例可以延迟或异步初始化,而静态类通常在首次加载时进行初始化,从而导致潜在的类加载器问题。
- 不过,最重要的优势是可以多态地处理单例,而不会强迫用户假设只有一个实例。
这可能会对您有所帮助。
黑白单例和一堆静态方法的主要区别在于单例可以实现接口,因此您可以传递单例,就好像它是“只是另一个”实现一样。
您也可以克隆 Singleton 的对象,但是我们不能克隆静态类对象。