zoukankan      html  css  js  c++  java
  • 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的话,就可以避免这个问题。

  • 相关阅读:
    oracle-PL/SQL1
    ROS之Gazebo
    ROS之urdf 2
    ROS之urdf 1
    ROS 面部识别
    ROS x Arduino
    STM32F0的低功耗模式
    项目进度
    C++函数返回为引用
    STM32F0的多路ADC 无DMA
  • 原文地址:https://www.cnblogs.com/loong-hon/p/10314501.html
Copyright © 2011-2022 走看看