java基礎提高篇——對象的建立

來源:互聯網
上載者:User

標籤:

我一直使用構造器的方式產生或者初始化對象。最近發現一些對象在項目中並沒有實際作用,有時我只是需要它的一些功能,為此建立一個對象是不是比較消耗資源,影響程式的效能呢。今天看到一些資料,對這個問題作出了一個回答。

說明:

      首先肯定的是,我們有時候並不需要一個類的全部功能,或許我們需要的只是其中的一兩個方法,沒必要為此建立一個類。靜態方法解決了這個問題。靜態方法應該成為每個物件導向設計程式者必修課程。首先我們學習靜態方法建立對象。

      使用靜態工廠的方式產生對象的好處有這樣幾個好處:“一:靜態方法都有名字,使得你更明白自己在幹什麼”;“二:使用靜態方法不必在每次建立對象,節省了記憶體”;“三:更靈活,可以返回原傳回型別的任何子類型的對象”“四:代碼看起來更簡潔”;當然它也有缺點的,其中一個主要的缺點是,如果使用靜態方法產生對象,那麼似乎就可以不包含公有或者受保護的構造器,這樣的話子類想繼承的話就是不可能的事了。這個可以通過複合避開繼承來解決這個問題。

       下面將介紹幾個比較著名的靜態構造器的例子。

第一個例子:多參數類

        考慮這個一個需求,我需要建一個類。這個類是用來描述商品的產品說明的,那麼這個類就會有很多的參數,並且在每個對象對這個類中的參數需求都是不同的。如果使用重疊構造器,你需要寫很多的構造器,最多需要2的n次方個構造器。當然我不會這樣寫,我會使用javaBeans模式產生get、set方式。這種方式有缺點,老實說以我現在還看不到這樣寫的危害,似乎是在多線程中是不安全的。這裡還是推薦給大家一個更安全更完善的構造方法:

        使用builder模式來產生對象。大概的想法是這樣的:在這種多參數類的內部構建一個builder的內部類,使用內部類接收傳參,最後才是更新外部類的參數。這樣做的好處可以是事前檢測資料的合法性,對於不合法的資料可以事先處理掉,保證了資料的安全性。這裡給出一個例子(要編寫以及使用這樣的類,你需要知道內部類的文法),

public class BuiltTest {    private String name1, name2, name3, name4, name5, name6, name7;        /*     * 內部類builder     */    public static class Built {        private String name1, name2, name3, name4, name5, name6, name7;        public Built setname1(String name1) {            this.name1 = name1;            return this;        }        public Built setname2(String name2) {            this.name2 = name2;            return this;        }        public Built setname3(String name3) {            this.name3 = name3;            return this;        }        public Built setname4(String name4) {            this.name4 = name4;            return this;        }        public Built setname5(String name5) {            this.name5 = name5;            return this;        }        public Built setname6(String name6) {            this.name6 = name6;            return this;        }        public Built setname7(String name7) {            this.name7 = name7;            return this;        }        public BuiltTest built() {            return new BuiltTest(this);        }    }        //構造方法    private BuiltTest(Built built) {        this.name1 = built.name1;        this.name2 = built.name2;        this.name3 = built.name3;        this.name4 = built.name4;        this.name5 = built.name5;        this.name6 = built.name6;        this.name7 = built.name7;    }        //重寫toSting方法    @Override    public String toString() {        String str="My name is "+name1+","+name2+","+name3+","+name4+","+name5+","+name6+","+name7;        return str;    }}

 

調用的代碼:

//建立一個BuiltTest對象BuiltTest a=new BuiltTest.Built().setname1("xiaohua").setname2("小小").setname3("安徽").built();

這種builder方法建立起來的對象,經過測試在參數大於等於4時,效能是更優的。考慮到程式的擴充性,最好一開始就使用builder的構造器。

第二個例子:強化Singleton屬性

在一些程式中,為了資料安全,我們僅需要一個對象,這時我們需要Singleton模式。Singleton有三種寫法,第一種定義一個Singleton的常量,第二種方法使用工廠的方式返回一個Singleton的對象,第三種方式是返回一個枚舉類型的對象。在多執行緒安全性能上第三種方式是最安全的。

//第一種方式,產生一個final的對象,私人化構造方法public class Elvis {    public static final Elvis INSTANC_ELVIS = new Elvis();    private Elvis() {    }}
//第二章方法,又構造器產生一個Singleton的對象public class Elvis {    private  static final Elvis INSTANC_ELVIS = new Elvis();    private Elvis() {    }        public Elvis getElvis(){        return INSTANC_ELVIS;    }}
//第三種方法,編寫一個enum 類public enum Elvis {    INSTANC_ELVIS;    }

java基礎提高篇——對象的建立

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.