不变模式:
不变模式通常围绕一个具有不变性的类展开,即一个类的内部状态在创建后整个生命周期都不发生变化,这样的类可称为不变类。使用不变类的做法就叫做不变模式。这意味着对象的所有属性在对象创建后都是固定的,不能被改变。这样可以确保对象在多线程环境中的安全性,避免因并发修改而导致的不一致性问题。同时,不变对象可以被安全地共享,无需担心数据被意外修改。
但是不变模式并不一定只涉及到一个类。在实际应用中,可能会有多个类相互协作来共同实现不变性。例如,一个不变类可能会与其他类进行交互,而这些类也可能遵循不变模式的原则,或者为不变类提供必要的支持。
此外,不变模式不仅仅是使用不变类这么简单,它还涉及到一系列的设计原则和方法,以确保不变性的实现和维护。比如,在实现不变类时,需要考虑如何正确地初始化状态、如何避免提供修改状态的方法、如何处理继承关系等问题。
1.弱不变模式:
一个类的实例状态是不变的,但是这个类的子类实例具有可能会变化的状态
·类的成员变量权限修饰符为private,set方法不设置成员变量
·缺点:子对象可以是可变对象
2.强不变模式:
一个类的实例状态是不变的,这个类的子类实例也具有不可变化的状态。实现的途径是类所有的方法都是final类型,或者类本身用final修饰(没有子类)
如果String不是不变模式的话会出现什么问题??
答:
一、多线程安全问题
在多线程环境中,如果String类的对象可以被修改,那么多个线程同时操作同一个String对象时,可能会导致数据不一致。比如一个线程正在读取String的内容,另一个线程同时修改它,这可能会使读取线程得到错误的结果,或者引发程序崩溃。为了确保线程安全,就需要进行复杂的同步操作,这将极大地增加编程的难度和性能开销。
二、可预测性降低
不变模式使得String对象的行为具有高度的可预测性。一旦创建了一个String对象,你可以确定它的值不会改变。如果不是不变模式,程序在不同的地方使用同一个String对象时,其值可能会在任何时候被意外地修改,这会使程序的行为变得难以捉摸,增加了调试和维护的难度。
三、缓存失效
很多编程语言会对String对象进行缓存以提高性能。如果String不是不变模式,缓存就可能会失效。例如,假设一个缓存系统基于String的哈希值存储了一些数据,当String的值可以被修改时,其哈希值也可能会改变,这将导致缓存中的数据无法被正确找到,降低程序的性能。
四、影响代码的稳定性
许多库和框架都依赖于String的不变性。如果String不是不变模式,这些库和框架可能会出现错误行为。例如,在安全相关的代码中,对密码等敏感信息的处理通常假设String是不可变的,以防止密码被意外修改或泄露。如果String可变,就会增加安全风险。
五、破坏函数式编程原则
在函数式编程中,强调不可变数据和无副作用的函数。如果String不是不变模式,就难以在函数式编程中安全地使用String对象,这会破坏函数式编程的原则,影响函数式编程的优势发挥。