美文网首页
String为何称为不可变类

String为何称为不可变类

作者: sendos | 来源:发表于2018-11-15 15:56 被阅读6次

    什么是不可变类

    不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。
    可变类:可变类就是该类生成的实例的成员变量等是可以被改变的,大多数类基本都是可变类。

    不可变类的优势

    不可变类最大的优势就是线程安全,因为触发线程不安全就是当一个变量是共享变量的时候,有多个线程同时访问该变量,并且去修改,则就会触发线程不安全。而不可变类由于内容已经不可变,只能读取,所以就不会出现线程安全问题。

    不可变类的设计原则

    • 类必须是final型的,防止被继承
    • 类里面的成员变量是final型的,防止被修改,并且是private
    • 成员变量不能暴露setter()方法,只暴露get()方法,防止被修改
    • 通过构造函数初始化成员变量
    • 成员变量的get方法,最好返回该变量的拷贝,防止变量外泄

    String为何是不可变类

    String的源码如下:

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
    
        /** Cache the hash code for the string */
        private int hash; // Default to 0
    
        /** use serialVersionUID from JDK 1.0.2 for interoperability */
        private static final long serialVersionUID = -6849794470754667710L;
    
        /**
         * Class String is special cased within the Serialization Stream Protocol.
         *
         * A String instance is written into an ObjectOutputStream according to
         * <a href="{@docRoot}/../platform/serialization/spec/output.html">
         * Object Serialization Specification, Section 6.2, "Stream Elements"</a>
         */
        private static final ObjectStreamField[] serialPersistentFields =
            new ObjectStreamField[0];
    
        public String(String original) {
            this.value = original.value;
            this.hash = original.hash;
        }    
    
        void getChars(char dst[], int dstBegin) {
            System.arraycopy(value, 0, dst, dstBegin, value.length);
        }
        /** ......*/
    }
    

    可以看到,String的源码里面有很多个不可变的特点

    • 类被final修饰,不会被继承
    • 成员变量都用final以及private修饰,表示一经初始化,就不会被改变
    • 源码里面没有暴露对成员变量的setter方法
    • 对于getter方法,如上面的getChars方法,返回的是copy后的值
    • 在构造函数就对成员变量进行初始化

    相关文章

      网友评论

          本文标题:String为何称为不可变类

          本文链接:https://www.haomeiwen.com/subject/fhpyfqtx.html