java如何在字符串类中实现不变性,在代码中如何在StringBuffer和StringBuilder中实现易变性?
我知道使一个类不变的先决条件。我查看了代码,在String
中定义的任何变量都没有设置器。对于StringBuffer
和StringBuilder
,有两个设定者:
setLength
调用父AbstractStringBuilder
的同名setter李>setCharAt
操纵父AbstractStringBuilder
的char value[]
李>
你可以在下面搜索框中键入要查询的问题!
我知道使一个类不变的先决条件。我查看了代码,在String
中定义的任何变量都没有设置器。对于StringBuffer
和StringBuilder
,有两个设定者:
setLength
调用父AbstractStringBuilder
的同名setter李>
setCharAt
操纵父AbstractStringBuilder
的char value[]
李>
# 1 楼答案
String
是“不可变的”,因为它的API(它定义的公共方法)无法让调用方更改其状态。其他类,比如StringBuilder
,是可变的,因为它们确实提供了“mutators”,或者改变类状态的方法在封面下,可变对象和不可变对象之间没有什么不同。对象只是组成其字段的原语和引用值,所有字段在概念上都是可变的(暂时忽略
final
关键字)。但是,通过限制这些字段的可见性(例如,使它们private
),并定义限制调用方可以做的事情的方法(例如定义getter而不是setter),可以保证类的实例是不可变的,也就是说,你保证它的字段(或它们引用的对象)在它的生命周期内不会改变通过使用
final
关键字,可以更明确地说明类是不可变的。如果您只是不提供mutator方法,那么如果某个私有方法对类进行了变异,那么类仍然可能是可变的。如果一个类中的所有字段都标记为final
,那就不可能(normally)。您可以确信,任何只有final
基元(或不可变)字段的类都是不可变的*。这不是保证不变性的唯一方法,但它是最明确的——任何试图改变类的尝试都将是编译器错误*类本身也必须声明
final
,否则有人可能会创建一个可变的子类。但是,还有其他方法可以确保不变性。在任何地方使用final
都是最容易看到的# 2 楼答案
这里有很多东西