1、使用私有构造器或者枚举类型强化singleton
1》单例模式---私有构造器,提供一个公有的成员是一个静态工厂方法:
public class SingleTon{
private static final  SingleTon single=new SingleTon();
private SingleTon(){ }
public static SingleTon getInstance() {
return single;
}
}
工厂方法的优势一在于它提供了灵活性:在不改变其他api的前提下,我们可以改变改类是否应该为singlton的想法。
但是缺点,在于它很容易被修改,比如改成每个调用改方法的线程返回一个唯一实例。优势二与泛型有关。
2》使用枚举类型:
//enum singleton 
public enum SingleTon{
SINGLE;
public void leaveTheBuilding(){。。。}
}
功能上与公有域方法相近,更加简洁,无偿提供序列化机制(上面方法没有提供,需要添加一些序列化操作)
绝对防止了多次实例化。

2、通过私有构造器强化不可实例化能力
显示的构造器私有化,不让外部调用,也不能让它实现子类化,(抽象类可以实现本类不可实例化,但是可以通过子
类化,间接的实例化类)。

3、避免不必要的对象创建
最好能重用对象而不是每次都创建一个相同功能的对象。如果对象是不可变的,它始终可以被重用。
一个极端的例子:
String s=new String(“adffdase”);
每次调用都会创建一个新对象,要是在循环里面,创建的对象可想而知,会创建成千上万的不必要的对象实例。
改进:Sting s=“adffdase”;
也可以使用静态工厂方法,我就不多说了。
4、当你从手工管理内存语言转到java开发,程序在用玩对象之后,会被自动回收,这是多么美好的事情,但是,你
不要认为不再考虑内存管理了
看看下面的代码:
public class Stack{
private Object[] obj;
private int size =0;
public Stack(){
obj = new Object[ 16 ];
}
public void push (Object o){
ensureCapacity();
obj [size++]=o;
}
public Object pop(){
if(size ==0){
throw new EmptyStackException();
}
return obj[--size];
}
private void ensureCapacity(){....}
}
这段代码,看起来没问题,测试也不会有问题,功能都正常,但是隐藏着一个问题,有可能引起内存泄露,
随着垃圾回收器活动的增加,内存占用会不断增加,程序的性能也会降低。
内存泄露发生在哪里呢??
如果一个栈先增长,然后收缩,那么从栈中弹出的对象将不会被回收,即使不在使用这些被弹出的
对象,它们也不会被回收。这是因为,栈内部维护者对这些对象的过期引用(永远不会被解除的引用)。
所以,即便是在java中也要主动回收这些垃圾对象。
改进:
public Object pop(){
if(size ==0){
throw new EmptyStackException();
}
Objcet result =obj[--size];
obj[size]=null;//释放掉弹出栈的对象的引用
return result;
}
我们应该在那些情况下需要注意,对象的主动回收呢??
第一,只要类是自己管理内存,程序员就该警惕内存泄露问题。
第二, 内存泄露的另一常见来源是缓存。
第三,监听器和其他回调。如果使用注册回调,记得用完取消注册。

【代码优化】私有构造器使用及对象创建优化相关推荐

  1. 6.面向对象,构造器,递归以及对象创建时内存分析(内含代码与练习)

    面向对象的概念以及特征 概念 实质上将 "数据" 与 "行为" 的过程, 以类的形式封装起来, 一切以 对象 为中心的 面向对象的程序设计过程中有两个重要概念: ...

  2. JAVA构造器及对象创建的过程

    今天学妹问我Java对象到底是怎么创建的?那我必须要从底层给学妹讲清楚呀! 一. 构造器 JAVA中构造器也称为构造方法,它用于对象的初始化. 构造器分为: 无参构造器 有参构造器 构造器的一些特点: ...

  3. Java 并发编程解析 | 如何正确理解Java对象创建过程,我们主要需要注意些什么问题?

    苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 从接触 Java 开发到现在,大家对 Java 最直观的印象是什么呢?是它宣传的 &qu ...

  4. 【JVM】Java对象创建的流程步骤

    · 本文摘要 · 罗列Java创建对象的各种方式: · 讲解Java对象创建的流程步骤: 一.Java创建对象的各种方式 · 1. 用关键字new,老少皆知的方法:StringBuffer sb = ...

  5. java对象创建的流程到底是什么样子的?new一个对象是真的直接放在堆里吗?其实大有学问!

    目录 对象创建流程图 总结 逃逸分析 什么是逃逸分析? 对象逃逸状态 逃逸分析优化 TLAB区 对象如何进入老年代 有问题可以直接留言讨论~ 对象创建流程图 1.编译器通过逃逸分析,确定对象是在栈上分 ...

  6. 用私有构造器或者枚举类型强化Singleton 属性

    Singleton 是仅仅被实例化一次,Singleton通常被代表一个无形状对象 实现Singleton有两种常见的方法.这两种构造器方法都要保持构造器私有,并导出公有的静态成员,以便客户端能够访问 ...

  7. 【Effective Java】第二章:静态工厂、构建器、强化Singleton属性、私有构造器、

    文章目录 一. 用静态工厂方法代替构造器 优势: 劣势: 实例代码: 二. 遇到多个构造器参数时要考虑使用构建器 ① 重叠构建器 ② JavaBeans模式 ③ Builder模式 三. 用私有构造器 ...

  8. JavaScript的中对象创建和继承原理

    对象创建: 当一个函数对象被创建时候,Function构造器产生的函数对象会运行类似这样的代码: this.prototype={constructor:this}; 假设函数F F用new方式构造对 ...

  9. 用私有构造器或枚举类型强化Singleton属性(3)

    2019独角兽企业重金招聘Python工程师标准>>> 1.Singleton 代表那些本质上唯一的系统组件.增加客户端调试难度 2.Singleton 实现方法1: 构造器保持私有 ...

  10. java单例模式构造器初始化_秒懂java单例模式,java私有构造器与一夫一妻制

    在<秒懂java,对于创建一个java对象,你真的会吗?>一文中,讲述了java如何创建一个对象以及如何更优雅的创建对象.此外,java里还有一种比较特殊的创建对象的方式:私有构造器创建对 ...

最新文章

  1. 一个效率更高的全半角字符串截取函数
  2. maven安装错误履历
  3. Python numpy 平方、乘方和平方根函数
  4. 【OpenCV3】旋转矩形(cv::RotateRect)的绘制
  5. sap屏幕元素与事件
  6. 时间管理无非就是一个玩耍俄罗斯方块的过程,堆堆堆哈哈哈哈
  7. Gradle在大型Java项目上的应用
  8. matlab length_MATLAB入门
  9. 遍历数组长度_Java基础之数组
  10. mysql 修改表属主_mysql主从配置实现一主一从读写分离
  11. VS2010编译:_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
  12. 如何用matlab画圆
  13. 用 Python 打造属于自己的GUI图形化界面
  14. 从巨噬细胞macrophage_clean先去 除线粒体再提取AM1 AM2 AM3
  15. 施一公讲解如何提高阅读英语的能力
  16. excel透视表(pivot table)
  17. AVR单片机ATmega16之初识PWM模式
  18. python自动化测试实战-无涯(学习与研究)[一]
  19. java构建树状结构工具类
  20. 程序员用代码求救, 同事“秒懂”

热门文章

  1. 矩阵范数的等价性(原创)
  2. node重命名文件名_node文件批量重命名
  3. PHP获取真实客户端的真实IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR
  4. selenium-绕过登录
  5. angular解决跨域问题
  6. javascript 函数2——对象排序
  7. javascript一维数组的排序
  8. innodb 关键特性、缓冲池、插入缓冲、两次写
  9. 服务器上多个php,php – 在多个服务器上扩展cronjobs
  10. 【Spring-tx】事务逻辑