考虑用静态构造方法代替构造器的好处:
1、静态构造方法有名字
    BigInteger.probablePrime(int, int, Random)比 new BigInteger(int, int, Random)更加清楚,从名字知道返回可能是素数。
    如果没有名字,将来给别人调用时,对方往往不知道该用哪个。
2、可以不必在每次调用时重新创建一个新对象
    其实就是享元模式和单例模式
3、可以返回原类型的任何子类型对象。
    这样可以使API变得更加简洁
    这里可以引申到“服务提供者框架模式”,类似于JDBC
4、创建参数化类型实例时,代码变得更简洁
    比如Map<String, List<String>> map = new HashMap<String, List<String>>();
    如果JDK有提供如下方法的话:
 public static <K, V> Map<K, V> newInstance(){
       return new HashMap<K,V>();
 }
可以直接Map<String, List<String>> map  = newInstance();

不过现在的JDK还没有这个方法。

 
考虑用静态构造方法代替构造器的坏处:
1、由于使用静态构造方法,会把原来的构造器去掉,造成这个类将无法被继承。
    不过这样倒也正好鼓励使用复合,而非继承。
2、它与其他普通的静态方法没有区别,文档或者一些工具,无法自动区分出这是构造方法。
    如果有人要查这个类的构造方法,将很难找。
 
 
 
参数多的时候,并且有些参数是可选的,builder模式更好
 
 
关于单例模式的强化:
传统的单例模式会被反射破坏掉,可以在构造器里计数,如果创建第二次则抛异常。
传统的单例模式会在序列化和反序列化之后变成两个,需要重写readResolve方法,返回原来的单例
 
单例模式的最佳方法:单元素枚举,可以解决上述两个问题。
 
 
避免创建不必要的对象:
1、比如,String s = new String("abc"); 应该改成 String s = "abc";
2、更倾向于使用静态构造器,比如:Boolean.valueOf(String)替代new Boolean(String),因为前者内部有复用对象,后者肯定会产生一个新对象。
3、明知不会改变的对象,要复用。比如判断时间是否落在某个起止时间之间,这里的起止时间是固定的,不需要每次判断时生成。
4、Map的keySet每次返回的是同一个Set,所以产生多个也没害处,却也是没有必要的。
5、优先使用基本类型(int),虽然包装类(Integer)用起来和基本类型几乎无差别,但其中隐式的包装和解包装会比较耗性能。
 
 
WeakHashMap : 当key被除了map本身引用之外,再无别的地方引用时,该key会被自动删除。
 
缓存以及回调等容易引起内存泄漏的地方,推荐使用WeakHashMap,弱引用的方式。
 
 
大部分情况下,避免使用finalizer方法:
1、因为finalizer方法被执行的时间是不确定的,甚至有可能根本不执行。
    比如在finalizer方法里做关闭文件的动作是错误的,因为对象失去引用后到执行finalizer的时间不确定,所以文件不会被及时关闭。
2、finalizer在不同JVM上执行的时机也未必相同。
    有可能在开发测试时的JVM上表现很好,但到了现场的JVM表现就很差,不稳定。
3、System.gc与System.runFinalization只能增加finalizer被执行的机会,但仍然是不确定的。
4、System.runFinalizationOnExit以及Runtime.runFinalizersOnExit能保证finalizer一定被执行,但这两个方法有致命缺陷,已经被废弃。
5、未被捕获的异常在finalizer过程中抛出是会被忽略的,甚至连警告都不会打印出来。
6、使用finalizer有一个非常严重的性能损失,创建和销毁对象比原来慢很多
 
不使用finalizer,可以使用显示的终结方法,典型的比如InputStream的close方法,要求调用者必须在结束时调用。
但finalizer可以充当显示终结方法的"安全网",在调用者忘记调用显示终结方法时,可以在finalizer里执行,因为这个时候调用者已经忘记了,即使finalizer的执行很不稳定,那也比没有关闭一些资源要好。比如FileInputStream就是采用这种“安全网”。
 
finalizer的另一个合理的用途是,对本地对象(native object)的回收资源,本地对象比较特殊,垃圾回收器是不会回收本地对象,所以需要调用finalizer来回收非关键资源。
 
 
 

EffectiveJava笔记(第一部分)的更多相关文章

  1. 《javascript权威指南》读书笔记——第一篇

    <javascript权威指南>读书笔记——第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本 ...

  2. ActionBarSherlock学习笔记 第一篇——部署

    ActionBarSherlock学习笔记 第一篇--部署          ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android ...

  3. C++ Primer 笔记 第一章

    C++ Primer 学习笔记 第一章 快速入门 1.1 main函数 系统通过调用main函数来执行程序,并通过main函数的返回值确定程序是否成功执行完毕.通常返回0值表明程序成功执行完毕: ma ...

  4. Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式

    Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...

  5. Android群英传笔记——第一章:Android体系与系统架构

    Android群英传笔记--第一章:Android体系与系统架构 图片都是摘抄自网络 今天确实挺忙的,不过把第一章的笔记做一下还是可以的,嘿嘿 1.1 Google的生态圈 还是得从Android的起 ...

  6. Scala语言笔记 - 第一篇

    目录 Scala语言笔记 - 第一篇 1 基本类型和循环的使用 2 String相关 3 模式匹配相关 4 class相关 5 函数调用相关 Scala语言笔记 - 第一篇 ​ 最近研究了下scala ...

  7. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

  8. [编程笔记]第一章 C语言概述

    //C语言学习笔记 第一讲 C语言概述 第二讲 基本编程知识 第三讲 运算符和表达式 第四讲 流程控制 第五讲 函数 第六讲 数组 第七讲 指针 第八讲 变量的作用域和存储方式 第九讲 拓展类型 第十 ...

  9. 《Linux内核设计与实现》读书笔记——第一、 二章

    <Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...

随机推荐

  1. python gzip,bz2学习

    一.gzip import gzip 1.解压缩 a = gzip.open('a.tar.gz') b = open('a.tar','wb') b.write(a.read()) a.close( ...

  2. Baseline管理

    1.创建基线 SQL> exec dbms_workload_repository.create_baseline(start_snap_id=>,end_snap_id=>,bas ...

  3. windows下统计代码量

    windows 工具 1.exe程序 http://blog.csdn.net/hui1502/article/details/51191678 https://sourceforge.net/pro ...

  4. linux: centos设置ip以及连接外网

    注明:我使用的的使centos 7,所有文件名是ifcfg-enp0s3, 一. 设置虚拟机中linux的ip,使本地能连通虚拟机的linux系统 1>.进入本地windows的cmd,输入ip ...

  5. 通过zabbix自带模板监控windowsPC机器

       通过zabbix自带模板监控windowsPC机器   作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.       欢迎加入:高级运维工程师之路 598432640 相信有很多 ...

  6. 转:Tomcat配置

    一.修改Tomcat端口号步骤: 1.找到Tomcat目录下的conf文件夹 2.进入conf文件夹里面找到server.xml文件 3.打开server.xml文件 4.在server.xml文件里 ...

  7. 转:windows 7系统安装与配置Tomcat服务器环境

    工具/原料 jdk-7u45-windows-x64(我的系统是64位系统,32位的请选x86下载) apache-tomcat-8.0.0-RC5-windows-x64 方法/步骤   下载说明, ...

  8. MFC架构

    MFC的六大关键技术: 1)MFC程序的初始化过程 2)消息映射 3)运行时类型识别(RTTI) 4)动态创建 5)永久保存 6)消息传递 一.MFC的初始化过程: MFC的架构组成: 1.要有CWi ...

  9. 某个点到其他点的曼哈顿距离之和最小(HDU4311)

    Meeting point-1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. Java基础(55):Exception类详解(转)

    Java中的异常 Exception java.lang.Exception类是Java中所有异常的直接或间接父类.即Exception类是所有异常的根类. 比如程序: public class Ex ...