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的话,就可以避免这个问题。

原文地址:https://www.cnblogs.com/loong-hon/p/10314501.html