java频繁new对象的优化方案

Wesley13
• 阅读 147

在实际开发中,某些情况下,我们可能需要频繁去创建一些对象(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的话,就可以避免这个问题。

点赞
收藏
评论区
推荐文章
秃头王路飞 秃头王路飞
5个月前
webpack5手撸vue2脚手架
webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。languageJavaScript"name":"vuecliversion2","version":"1.0.0","desc
技术小男生 技术小男生
5个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
5个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
刚刚好 刚刚好
5个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
小森森 小森森
5个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
晴空闲云 晴空闲云
5个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
5个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
Clone
Java中对象的创建clone顾名思义就是复制,在Java语言中,clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?1使用new操作符创建一个对象2使用clone方法复制一个对象那么这两种方
密钥管理系统-为你的天翼云资产上把“锁
本文关键词:数据安全,密码机,密钥管理一、你的云上资产真的安全么?1.2021年1月,巴西的一个数据库30TB数据被破坏,泄露的数据包含有1.04亿辆汽车和约4000万家公司的详细信息,受影响的人员数量可能有2.2亿;2.2021年2月,广受欢迎的音频聊天室应用Clubhouse的用户数据被恶意黑客或间谍窃取。据悉,一位身份不明的用户能够将Clubho
NVIDIA安培架构下MIG技术分析
关键词:NVIDIA、MIG、安培一什么是MIG2020年5月,NVIDIA发布了最新的GPU架构:安培,以及基于安培架构的最新的GPU:A100。安培提供了许多新的特性,MIG是其中一项非常重要的新特性。MIG的全名是MultiInstanceGPU。NVIDIA安培架构中的MIG模式可以在A100GPU上并行运行七个作业。多实
helloworld_28799839 helloworld_28799839
5个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue