String為何稱為不可變類

什么是不可變類

不可變類:所謂的不可變類是指這個類的實例一旦創(chuàng)建完成后,就不能改變其成員變量值。如JDK內(nèi)部自帶的很多不可變類:Interger、Long和String等。
可變類:可變類就是該類生成的實例的成員變量等是可以被改變的,大多數(shù)類基本都是可變類。

不可變類的優(yōu)勢

不可變類最大的優(yōu)勢就是線程安全,因為觸發(fā)線程不安全就是當一個變量是共享變量的時候,有多個線程同時訪問該變量,并且去修改,則就會觸發(fā)線程不安全。而不可變類由于內(nèi)容已經(jīng)不可變,只能讀取,所以就不會出現(xiàn)線程安全問題。

不可變類的設計原則

  • 類必須是final型的,防止被繼承
  • 類里面的成員變量是final型的,防止被修改,并且是private
  • 成員變量不能暴露setter()方法,只暴露get()方法,防止被修改
  • 通過構造函數(shù)初始化成員變量
  • 成員變量的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修飾,表示一經(jīng)初始化,就不會被改變
  • 源碼里面沒有暴露對成員變量的setter方法
  • 對于getter方法,如上面的getChars方法,返回的是copy后的值
  • 在構造函數(shù)就對成員變量進行初始化
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,633評論 18 399
  • 錢鐘書曾對他的學生說: 不要嫁給天才,嫁給天才是很苦的。 此中滋味怕是沒有人比謝燁更了解了。 謝燁曾經(jīng)和友人聊起自...
    芬克閱讀 35,397評論 6 9
  • 山水間是你一舞 再也移不開眼 繁華盡 無聲語 萬物多憐 唯你可見 冥冥間 情緒因你而變 你翩若驚鴻 出現(xiàn)在我的夢里...
    云水未風閱讀 349評論 0 2
  • 如何培養(yǎng)你的自尊自信? 做難事 每天早上4點起床 很難 起床第一件事跑步 很難 晚上一個人加班或者寫作很難 去陌生...
    勇敢菇閱讀 322評論 0 1

友情鏈接更多精彩內(nèi)容