更多課程 選擇中心
        Java培訓

        400-111-8989

        Java培訓 > Java問答庫  > 正文

        Java如何創建不可變類 ?

        • 發布:Java培訓
        • 來源:Java問答庫
        • 時間:2017-02-24 13:50

        class:java中class確切的表示為一個類

        object:java中object確切的表示為一個對象,也稱為類的實例

        其實,如果一個類被設計成不可變的類,那么這個類的實例化對象也是不可變的。

        不可變類:當你獲得這個類的一個實例引用時,你不可以改變這個實例的內容。

        那么,什么是不可變對象?

        一旦一個類的實例化對象被創建并初始化,那么它就不可以被改變。我們可以調用訪問器方法(getter),復制對象,或者傳遞對象,但是不允許任何方法改變這個對象的狀態。包裝類(e.g.Integer或Float)和String類是不可變類的代表。

        訪問器方法(accessor method):對成員變量做出訪問的方法,e.g.getter()方法。

        修改器方法(mutator method):對成員變量做出修改的方法,e.g.setter()方法。

        定義一個不可變類

        如果我們要自己創建一個不可變類,需要遵守下面的規則:

        將成員變量(field:在一些書中也翻譯為域)聲明成final并在構造器中初始化。

        對于基本類型的成員變量,用final修飾,一旦它被初始化,就不能被改變了。而對于引用類型的成員變量,不能夠改變它的引用。

        成員變量如果被聲明稱final,那么構建對象時,必須要初始化這樣的域

        引用類型是可變的,我們需要采取一些措施來保證它的不可變性。

        為什么?如果我們只是聲明了一個final的可變引用類型,那么這個引用可以去引用外部的類,或者被其他外部類引用。在這種情況下,我們要做到:

        1.這些方法不會改變這些可變對象中的內容

        2.不要將這些引用分享到外部供其他類使用,例如,如果對成員變量的引用是可以被其他類改變的,那么這些外部類就可以改變這個類中的內容。

        3.如果必須要返回一個引用,那么就返回一個對象的深度拷貝,這樣盡管返回的對象內容改變了,但也保存著原始的內容。

        只提供訪問器方法(i.e. getter方法)不提供修改器方法(i.e.setter方法)

        如果一定要改變這個對象的內容,那就創建一個新的不可變對象內容做相應的修改,返回修改后的對象的引用聲明類是final的。如果一個類可以被繼承,那么它子類就可以重載它的方法,并且修改成員變量

        Java API中不可變類的例子

        讓我們來回顧一下String類,用它來理解上述的幾個方面在String類實現中的體現:

        所有在Stirng類中成員變量都被聲明成private,這些成員變量都在構造器中在構建對象時被初始化。

        trim concat substring 都可以改變String的對象,為了保證String的不可變性,這些方法都返回的是一個改變相應內容后新的對象。

        string類被聲明稱final,所以任何類都不能繼承,重載它的方法。

        自己實現一個不可變類

        接下來我們自己實現一個不可變類ImmutableCircle。

        //ImmutableCircle.java

        // Point is a mutable class

        class Point {

        private int xPos, yPos;

        public Point(int x, int y) {

        xPos = x;

        yPos = y;

        }

        public String toString() {

        return "x = " + xPos + ", y = " + yPos;

        }

        int getX() { return xPos; }

        int getY() { return yPos; }

        }

        // ImmutableCircle is an immutable class – the state of its objects

        // cannot be modified once the object is created

        public final class ImmutableCircle {

        private final Point center;

        private final int radius;

        public ImmutableCircle(int x, int y, int r) {

        center = new Point(x, y);

        radius = r;

        }

        public String toString() {

        return "center: " + center + " and radius = " + radius;

        }

        public int getRadius() {

        return radius;

        }

        public Point getCenter() {

        // return a copy of the object to avoid

        // the value of center changed from code outside the class

        return new Point(center.getX(), center.getY());

        }

        public static void main(String []s) {

        System.out.println(new ImmutableCircle(10, 10, 20));

        }

        // other members are elided ...

        }

        上面的程序運行之后,打印:

        center: x = 10, y = 10 and radius = 20

        上面的程序體現了不可變類的以下幾點:

        · 這個類被聲明成final,不可以被繼承,也不可以重載它的方法

        · 這個類的成員變量都是final并且是私有的

        · 因為成員變量center是一個引用類型,是可變的,所以在他的getter方法中,返回的是對point對象的拷貝

        設計一個不可變的類最關鍵的一點

        要注意引用類型的成員變量,如果成員變量的類型是可變的引用類型,就必須要采取必要的措施來保護這個成員變量不會被修改

        不可變類不足的地方

        不可變對象同樣也有不足的地方。為了保證不可變性,不可變類中的方法會創建出一定量的對象的拷貝。例如,在上面的代碼中,每次調用getcenter方法都會新建并返回一個point對象的拷貝。而假如我們只需要調用一次,返回一個point對象,就沒必要費盡心神的去設計一個不可變類,僅僅只需要一個可變的immutablecircle類就可以了。

        String類在很多應用場景中都會用到,如果我們調用String類中trim,concat,或者是在循環中調用substring方法,都會創建一個新的臨時String對象。同時,java也提供了Stringbuffer和Stringbuilder的可變類。他們同String一樣,但是卻可以改變這個對象的內容。所以,我們可以根據不同的場景使用String類或者Stringbuffer/Stringbuilder類。

        總結,文章的最后還是那句話,要根據自己的實際需要,去設計代碼,而不要過度設計。

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:什么是Java代碼的編譯與反編譯?
        下一篇:數據庫是什么?Oracle又是啥玩意?
        零基礎學習Java,參加Java培訓靠譜嗎?

        零基礎學習Java,參加Java培訓靠譜嗎?

        零基礎Java培訓課程內容是什么?

        零基礎Java培訓課程內容是什么?

        Java程序員培訓機構該怎么去選擇?

        Java程序員培訓機構該怎么去選擇?

        Java培訓的價格是多少?

        Java培訓的價格是多少?

        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        貴州省

        福建省

        • 達內廈門軟件園中心
        廣西省

        海南省

        国产高清情侣视频2019年,限制电影福利在线观看,23伊人大香蕉 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>