java頻繁new對象的優化方案


在實際開發中,某些情況下,我們可能需要頻繁去創建一些對象(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的話,就可以避免這個問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM