在實際開發中,某些情況下,我們可能需要頻繁去創建一些對象(new),下面介紹一種,我從書上看到的,可以提高效率的方法。
首先,對於將會頻繁創建的對象,我們要讓這個類實現Cloneable接口,因為這個優化的核心,就是利用clone。
clone的最大特點就是,不會去調用任何構造方法,所以,在我看來重點應該放在構造方法中。
1.先寫一個實體類:
在此實體類中寫一個getInstance(),其中就是返回clone()。
import java.io.Serializable; /** * @ClassName: 生產單ERP * @author hanwl * @Description: TODO */ public class ErpProduct implements Serializable,Cloneable{ private static final long serialVersionUID = 1L; private static ErpProduct erpProduct = new ErpProduct(); private String topicNum;//選題號 選填 private String compName;//部件名 必填 (多個部件以 ','分隔 封面,正文) private String printShop;//印廠名 必填 private String printUser; //分發人 必填 private String reback;//是否撤回 必填 0 默認分發 1撤回分發 private String printNum;//印數 (選填) public ErpProduct() { super(); } /** * 調用對象創建優化 * * @return */ public static ErpProduct getInstance(){ try { return (ErpProduct) erpProduct.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return new ErpProduct(); } public String getTopicNum() { return topicNum; } public void setTopicNum(String topicNum) { this.topicNum = topicNum; } public String getCompName() { return compName; } public void setCompName(String compName) { this.compName = compName; } public String getPrintShop() { return printShop; } public void setPrintShop(String printShop) { this.printShop = printShop; } public String getPrintUser() { return printUser; } public void setPrintUser(String printUser) { this.printUser = printUser; } public String getPrintNum() { return printNum; } public void setPrintNum(String printNum) { this.printNum = printNum; } public String getReback() { return reback; } public void setReback(String reback) { this.reback = reback; } }
2.在主方法中調用的時候直接getInstance()就可以。
public static void main(String[] args) { long beginTime = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { ErpProduct.getInstance(); } long endTime = System.currentTimeMillis(); System.out.println("采用clone的方法,一共花費的時間:" + (endTime - beginTime)); beginTime = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { new ErpProduct(); } endTime = System.currentTimeMillis(); System.out.println("采用new的方法,一共花費的時間:" + (endTime - beginTime)); }
當一個類存在繼承關系時,你創建一個子類的對象時,如果在沒有明確指定的情況下,子類是會隱式的去調用父類的無參構造的。假設,我們需要頻繁創建的對象,是一個繼承關系比較深的類的話,調用構造函數的開銷不容小窺。
如果一時間內,頻繁創建某對象時,這些平時不顯眼的消耗一疊加起來,就變得很客觀了。但是,當我們使用clone的話,就可以避免這個問題。