有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 1 楼答案

    String是“不可变的”,因为它的API(它定义的公共方法)无法让调用方更改其状态。其他类,比如StringBuilder,是可变的,因为它们确实提供了“mutators”,或者改变类状态的方法

    在封面下,可变对象和不可变对象之间没有什么不同。对象只是组成其字段的原语和引用值,所有字段在概念上都是可变的(暂时忽略final关键字)。但是,通过限制这些字段的可见性(例如,使它们private),并定义限制调用方可以做的事情的方法(例如定义getter而不是setter),可以保证类的实例是不可变的,也就是说,你保证它的字段(或它们引用的对象)在它的生命周期内不会改变

    通过使用final关键字,可以更明确地说明类是不可变的。如果您只是不提供mutator方法,那么如果某个私有方法对类进行了变异,那么类仍然可能是可变的。如果一个类中的所有字段都标记为final,那就不可能(normally)。您可以确信,任何只有final基元(或不可变)字段的类都是不可变的*。这不是保证不变性的唯一方法,但它是最明确的——任何试图改变类的尝试都将是编译器错误

    *类本身也必须声明final,否则有人可能会创建一个可变的子类。但是,还有其他方法可以确保不变性。在任何地方使用final都是最容易看到的

  2. # 2 楼答案

    这里有很多东西

    1. All fields are private.
    2. There are no setters / mutators.
    3. Construction injection of arguments (using which String has to be constructed).
    4. Reference to underlying char array (char[] value) does not leak out of this class.