考虑用静态构造方法代替构造器的好处:
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. 用Visual Studio 2012+Xamarin搭建C#开发Andriod的环境

    第一步:安装Visual Studio: Visual Studio 2012(或者Visual Studio 2010),原因是目前为止Xamarin for Visual Studio的插件只支持 ...

  2. Java常用锁机制简介

    在开发Java多线程应用程序中,各个线程之间由于要共享资源,必须用到锁机制.Java提供了多种多线程锁机制的实现方式,常见的有synchronized.ReentrantLock.Semaphore. ...

  3. UIButton详解

    // ----------------------------------UIButton------------------------------ // UIButtonTypeSystem 点击 ...

  4. PL/SQL Developer连接到Oracle 12c

    安装32位的Oracle客户端instantclient-basic-nt-12.1.0.1.0.zip 下载地址:http://www.oracle.com/technetwork/topics/w ...

  5. 重复点击主界面(TabBar)按钮刷新界面--点击状态栏回到顶部

    1.监听按钮点击   2.判断是否是点击的同一个按钮(记录上次点击的按钮)   3.当重复点击相同按钮时,需要获取当前按钮对应控制器刷新界面      3.1 判断是否重复点击按钮,代码写在哪里?   ...

  6. JAVA类加载机制详解

    “代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是变成语言发展的一大步”,这句话出自<深入理解JAVA虚拟机>一书,后面关于jvm的系列文章主要都是参考这本书. JAV ...

  7. XML节点名称中有小数点处理(deal with dot)导致使用xpath时报错解决方法

    <?xml version="1.0"?> <ModifyFiles> <_Layout.cshtml>123456</_Layout.c ...

  8. javascript语法详解

    javascript语法:运算符 条件语句if...else...  条件语句switch  循环语句for  循环语句while   跳转语句 js运算符 1.算数运算符:+ - * % / ++ ...

  9. NVL 和NVL2函数

    NVL 和NVL2函数 NVL函数: nvl(exp1,exp2) -->判断exp1是否是null,如果exp1不是则返回exp1的值,如果exp1为null则返回exp2 nvl2函数: n ...

  10. cluster集群

    http://zwfang09.blog.sohu.com/entry/ Cluster 集群 ,群集 --- 负载均衡 LB ,load-balance --- 高可用集群 HA ,High Ava ...