標籤:
我一直使用構造器的方式產生或者初始化對象。最近發現一些對象在項目中並沒有實際作用,有時我只是需要它的一些功能,為此建立一個對象是不是比較消耗資源,影響程式的效能呢。今天看到一些資料,對這個問題作出了一個回答。
說明:
首先肯定的是,我們有時候並不需要一個類的全部功能,或許我們需要的只是其中的一兩個方法,沒必要為此建立一個類。靜態方法解決了這個問題。靜態方法應該成為每個物件導向設計程式者必修課程。首先我們學習靜態方法建立對象。
使用靜態工廠的方式產生對象的好處有這樣幾個好處:“一:靜態方法都有名字,使得你更明白自己在幹什麼”;“二:使用靜態方法不必在每次建立對象,節省了記憶體”;“三:更靈活,可以返回原傳回型別的任何子類型的對象”“四:代碼看起來更簡潔”;當然它也有缺點的,其中一個主要的缺點是,如果使用靜態方法產生對象,那麼似乎就可以不包含公有或者受保護的構造器,這樣的話子類想繼承的話就是不可能的事了。這個可以通過複合避開繼承來解決這個問題。
下面將介紹幾個比較著名的靜態構造器的例子。
第一個例子:多參數類
考慮這個一個需求,我需要建一個類。這個類是用來描述商品的產品說明的,那麼這個類就會有很多的參數,並且在每個對象對這個類中的參數需求都是不同的。如果使用重疊構造器,你需要寫很多的構造器,最多需要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基礎提高篇——對象的建立