1.前言
在實際開發中,某些情況下,我們可能需要頻繁去建立一些物件(new),下面介紹一種,我從書上看到的,可以提高效率的方法。
首先,對於將會頻繁建立的物件,我們要讓這個類實現cloneable介面,因為這個優化的核心,就是利用clone。
clone的最大特點就是,不會去呼叫任何構造方法,所以,在我看來重點應該放在構造方法中。
package util;
public class main
long endtime = system.currenttimemillis();
begintime = system.currenttimemillis();
for (int i = 0; i < 100; i++)
endtime = system.currenttimemillis(); }}
class testa catch (interruptedexception e)
} public string getaa()
public void setaa(string aa)
}class testb extends testa catch (interruptedexception e)
} public string getbb()
public void setbb(string bb)
}class person extends testb implements cloneable ;
public static person getoneperson() catch (clonenotsupportedexception e)
return null;
} // 模擬有參構造方法
public static person getonepersonwithinitname(string name) catch (clonenotsupportedexception e)
return null;
} public string getid()
public void setid(string id)
public string getname()
public void setname(string name)
public int gettemp()
public void settemp(int temp)
}
看一下,在我本機上的執行效果吧
可以很明顯的看出,同樣是迴圈100次,採用clone的方式要比new方式快得多得多。而且,從clone一共花費的時間,可以很輕鬆的看出並證實了我前面說的:「clone的最大特點就是,不會去呼叫任何構造方法「」。
2.簡要說明
我來稍微說明一下,我上面的測試**,為什麼要這樣寫吧。
2.1.我之所以是建立testa,testb這兩個看似毫無意義的類,並讓testb繼承testa,讓person繼承testb,主要是為了模擬建構函式遞迴呼叫的過程。各位應該也知道,當乙個類存在繼承關係時,你建立乙個子類的物件時,如果在沒有明確指定的情況下,子類是會隱式的去呼叫父類的無參構造的。假設,我們需要頻繁建立的物件,是乙個繼承關係比較深的類的話,呼叫建構函式的開銷不容小窺啊。
2.2.各位如果看一下我的測試**的話,應該不難看出,我在testa和testb這兩個類的建構函式中,都加了乙個睡眠,用於模擬一些耗時操作。(當然,在實際開發中,耗時操作不一定是10毫秒,可能更高或者更低,這裡主要是為了演示體現效果罷了)。如果當我們用new關鍵字去建立物件時,而這些物件的構造方法中,有可能會做某些事情,比如去初始化一些什麼,或者準備一些什麼等等。這些都是消耗不少時間的。如果一時間內,頻繁建立某物件時,這些平時不顯眼的消耗一疊加起來,就變得很客觀了。但是,當我們使用clone的話,就可以避免這個問題。
3.個人一些看法和補充
3.1方法名字很重要
在實際開發中,我們需要的不僅僅是無參構造,還有可能是有參構造。但是,當我們遮蔽了建構函式之後,乙個可以讓我們獲取這個類物件的方法的方法名,就顯示尤為重要了:比如,我上面寫到的getoneperson()和getonepersonwithinitname(string name)。
因為遮蔽了建構函式,上面這兩個方法就充當了建構函式的角色。當名字起得不好的時候,入參的名字起得不好的時候,是很容易讓別人困惑的。當
然,你說可以用注釋嘛。但是,在我看來,真正好的**,是應該具有自述性的。就是僅僅可以從方法名和入參名之間,就知道這個方法的意義和作用。雖然注釋很有用,但是你要明白,注釋和**的更新,往往是不同步的啊。當**和注釋失配時,就很坑爹了!!而且,其實,讓這些方法來充當建構函式時,無疑是在無形之間,增加了學習的成本。
3.2利用clone的這種建立物件的方式,和工廠模式很配哦~
java中的new與newInstance區別
newinstance例子 string classname 類名稱 class classxml class.forname classname domxml dx domxml classxml.newinstance string classname domxml class classxml...
Java中new和newInstance的區別
1 類的載入方式不同 在執行class.forname a.class.name 時,jvm會在classapth中去找對應的類並載入,這時jvm會執行該類的靜態 段。在使用newinstance 方法的時候,必須保證這個類已經載入並且已經連線了,而這可以通過class的靜態方法forname 來完...
對於new和override的理解
在成功的道路上,你沒有耐心去等待成功的到來,那麼,你只好用一生的耐心去面對失敗。override 和new 在同乙個宣告中使用 new和 override 修飾符是錯誤的。隱藏乙個繼承成員並不被認為是錯誤的,但是會造成編譯器給出警告。為了禁止這個警告,派生類成員的宣告可以包括乙個 new修飾符來指出...