開心一笑
【一個四歲的男孩親了三歲的女孩一口!
女孩對男孩說:“你親了我可要對我負責啊疙咸∠亟常”
男孩成熟地拍了拍女孩的肩膀,笑著說:“你放心,我都四歲了,又不是一兩歲的小孩子了” 】
**提出問題******
項目中如何使用對象???
解決問題
考慮用靜態(tài)工廠方法代替構(gòu)造器
例:
public static Boolean valueOf(boolean b) {
return (b ? Boolean.TRUE : Boolean.FALSE);
}
靜態(tài)方法和構(gòu)造器相比優(yōu)勢:
靜態(tài)方法有名稱续膳,構(gòu)造器沒有:一個類只能有一個帶有指定簽名的構(gòu)造器。如果需要2個兰粉,它們的參數(shù)列表只在參數(shù)類型的順序上有所不同。這并不是個好主意顶瞳。
靜態(tài)方法不必在每次調(diào)用它們的時候都創(chuàng)建一個新的對象玖姑。
靜態(tài)方法可以返回原返回類型的任何子類型的對象。例如:Java Collections的集合接口有32個便利實現(xiàn)慨菱,每種便利實現(xiàn)都對應一個類客峭。
-
靜態(tài)方法在創(chuàng)建參數(shù)化類型實例的時候,它們使代碼變得更加簡潔抡柿。
Map<String,List<String>> m = new HashMap<String,List<String>>();
//以后工作就用這種方法了,不過遺憾的告訴大家目前jdk沒改類似方法
Map<String,List<String>> m = HashMap.newInstance();
靜態(tài)方法的缺點:
- 類如果不含公有的或者受保護的構(gòu)造器等恐,就不能被子類化洲劣。不能子類化在某些情況下是無法接受的,但是课蔬,這樣也有好處:策略模式教導我們應該多用組合而不是繼承囱稽,當一個類不能子類化后,組合將是你唯一的選擇二跋。
- 靜態(tài)工廠方法和其他靜態(tài)方法本質(zhì)上并沒有區(qū)別
依靠一些約定俗稱的名稱分辨基本的靜態(tài)工廠方法战惊。具體包括:
valueOf() //方法返回的實例與參數(shù)具有相同的值
of() //valueOf 的簡化表示
getInstance() //返回的實例通過參數(shù)來描述
newIntance() //返回一個與現(xiàn)有實例不同的全新實例
getType() //Type 表示返回的對象類型,如 getString() 返回一個String對象
newType() //返回一個全新的 Type 類型的對象
總結(jié):
靜態(tài)方法通常更加合適扎即,因此切記第一方法就是提供共有的構(gòu)造器吞获,而不先考慮靜態(tài)工廠况凉。
遇到多個構(gòu)造器參數(shù)時要考慮構(gòu)造器
重疊構(gòu)造器模式:第一個構(gòu)造器只有一個必要參數(shù),第二個有一個可選參數(shù)各拷,第三個有兩個刁绒,以此類推,最后一個構(gòu)造器有全部的可選參數(shù)烤黍。創(chuàng)建實例的時候知市,選擇最短的列表參數(shù)的構(gòu)造器,當有許多參數(shù)的時候速蕊,客戶端代碼會很難編寫
參考高手文章:http://macrochen.iteye.com/blog/1113031
解決方法:采用構(gòu)建器(Builder)
public Class A{
private int a;
private int b;
private int c;
private int d;
public static class Builder{
// 這些是必要參數(shù)
private final int a;
private final int b;
//這些是可選參數(shù)
private int c;
private int d;
public Builder(int a, int b){
this.a=a;
this.b=b;
}
public Builder setC(int c){
this.c = c;
//注意是這里嫂丙,這里,看過來规哲,看過來
return this;
}
public Builder setD(int d){
this.d=d;
return this;
}
public A build(){
return new A(this);
}
private A(Builder builder){
a = builder.a;
b = builder.b;
c = builder.c;
d = builder.d;
}
}
使用:
A a = new A.Builder(1, 2).setC(3).setD(4).build();
總結(jié):
如果類的構(gòu)造器或者靜態(tài)工廠中具有多個參數(shù), 設計這種類時, Builder模式就是一種不錯的選擇. 特別是大多數(shù)參數(shù)都是可選的時候. 與使用傳統(tǒng)的重載構(gòu)造器模式相比, 使用Builder模式的客戶端將更易于閱讀和編寫.
用私有構(gòu)造器或者枚舉類型強化Singleton屬性
Singleton指被實例化一次的類跟啤。
參考高手文章:http://www.cnblogs.com/rilley/archive/2012/10/24/2737597.html
例:
//這種寫法存在缺陷,可以利用反射的方式來實例化多個不同的實例
//序列化和反序列換的時候也會出現(xiàn)多個不同的實例
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis {}
}
參考高手文章:http://blog.csdn.net/huangyuan_xuan/article/details/52193006
或者:
public class Elvis {
private staic final Elvis INSTANCE = new Envis();
private Elvis() {}
private static Elvis getInstance() {
//開過來媳叨,這里很重要
return INSTANCE;
}
}
或者:
public enum Elvis{
INSTANCE;
public void invoke(){...}
}
參考高手文章:http://callmegod.iteye.com/blog/1474441
public enum MaYun {
himself; //定義一個枚舉的元素腥光,就代表MaYun的一個實例
private String anotherField;
MaYun() {
//MaYun誕生要做的事情
//這個方法也可以去掉。將構(gòu)造時候需要做的事情放在instance賦值的時候:
/** himself = MaYun() {
* //MaYun誕生要做的事情
* }
**/
}
public void splitAlipay() {
System.out.println(“Alipay是我的啦糊秆!看你丫Yahoo綠眉綠眼的望著武福。。痘番∽狡”);
}
}
Call:MaYun.himself.splitAlipay();
單元素的枚舉類型已經(jīng)成為實現(xiàn)Singleton的最佳方法。
枚舉:很好汞舱,不僅能避免多線程同步問題伍纫,而且還能防止反序列化重新創(chuàng)建新的對象。但是失去了類的一些特性昂芜,沒有延遲加載莹规,用的人也太少了~~
以后多推廣推廣單元素枚舉這種更好的單例實現(xiàn)方式。在項目中的代碼開始修改實施泌神。
通過私有構(gòu)造器強化不可實例化的能力
- 對只有靜態(tài)方法和域的類良漱,主要用于把基本類型的值或數(shù)據(jù)類型上的相關方法組織起來(Math,Arrays)欢际,可以通過Collections的方法把實現(xiàn)特定接口的對象上的驚天方法組織起來母市,可以利用這種類把final類上的方法組織起來,以取代擴展該類的做法损趋。
- 此工具類是不希望被實例化的患久,實例化對他么有任何意義。然后我們?nèi)绻惶峁?gòu)造器,jvm會自己提供蒋失,那還是會被實例化返帕,那么我們只要在類中提供一個私有的構(gòu)造器就可以了,并添加注釋說明高镐。
這樣帶來的問題是不能子類化溉旋,因為子類要求要求super父類的構(gòu)造函數(shù)。
避免創(chuàng)建不必要的對象
一般來說嫉髓,最好能重用對象观腊,而不是在每次需要的時候,就創(chuàng)建一個相同功能的對象算行,如果對象是不可變的梧油,他就始終可以被重用。
例如
//"ay & al" 本身就是一個對象州邢,這樣寫的話儡陨,頻繁調(diào)用會造成成千上萬不必要的String實例
String s = new String("ay & al");
改進
String s = "al & ay";
對于同時提供的靜態(tài)工廠方法和構(gòu)造器的不可變類,通沉刻剩可以使用靜態(tài)工廠方法骗村,而不是構(gòu)造器,以避免創(chuàng)建不必要的對象呀枢。
例如
Boolean.valueOf(String)
優(yōu)于
Boolean(String)
要優(yōu)先使用基本類型而不是裝箱基本類型胚股,要當心無意識的自動裝箱。
例如
public static void main(String[] args){
Long sum = 0L;
for(long i=0;i<Integer.MAX_VALUE;i++){
sum + = i;//在這里不斷的進行裝箱和拆箱工作
}
System.out.println(sum);
}
消除過期的對象引用
清空引用對象應該是一種例外, 而不是一種規(guī)范行為
以下三種情況要考慮會發(fā)生內(nèi)存泄露:
- 類自己申請內(nèi)存管理
- 緩存裙秋,易忘記管理琅拌,如WeakHashMap可以自動處理沒有被外部引用的緩存項。一般利用后臺線程定時清理摘刑,也可以類似LinkedHashMap使用removeEldestEntry在添加條目時清理进宝。對于復雜的緩存,必須直接使用java.lang.ref
- 監(jiān)聽器和其他回調(diào)枷恕,回調(diào)此時可以做成弱引用党晋。
只要是類自己管理內(nèi)存, 程序員就應該警惕內(nèi)存泄露的問題.
讀書感悟
來自杰克·凱魯亞克《在路上》
- 真正不羈的靈魂不會真的去計較什么,因為他們的內(nèi)心深處有國王般的驕傲徐块。
- 我還年輕隶校,我渴望上路。帶著最初的激情蛹锰,追尋著最初的夢想,感受著最初的體驗绰疤,我們上路吧铜犬。
- 在路上,我們永遠年輕,永遠熱淚盈眶癣猾。
- 我們還有更長的路要走敛劝,不過沒關系,道路就是生活纷宇。
- “我一輩子都喜歡跟著讓我有感覺有興趣的人夸盟,因為在我心目中,真正的人都是瘋瘋癲癲的像捶,他們熱愛生活上陕,愛聊天,不露鋒芒拓春,希望擁有一切释簿,他們從不疲倦,從不講些平凡的東西硼莽,而是像奇妙的黃色羅馬煙火那樣庶溶,不停地噴發(fā)火花。
其他
如果有帶給你一絲絲小快樂懂鸵,就讓快樂繼續(xù)傳遞下去偏螺,歡迎轉(zhuǎn)載,點贊匆光,頂套像,歡迎留下寶貴的意見,多謝支持殴穴!