我的Effective Java 学习笔记(一)

学习记录,也是生活的一种记录。

第一条:考虑用静态工厂方法代替构造器

  1. 我们都是有身份证的人。

       静态工厂方法与构造器不同的最大优势就在于它们都是有个人身份id的,虽然构造方法能够通过改名参数类型或者参数个数等来区分,但一定意义上也会给开发带来一定的问题,因为不知道该调用哪个API,也因此常常会发生一些错误。更别说没有注释或者API文档时,那就是一种痛苦了,而静态工厂方法则不同,我们可以每个静态方法声明一个ID,而且一般的命名规则离不开对方法的总体概况,当我们调用此类方法的时候,即使没有文档或者注释的帮助,也能清楚地了解到这个方法到底是拿来做什么的。
    

构造方法

    public Boolean(boolean b){
         return b?Boolean.true:Boolean.false;
    }

静态工厂方法

    public static Boolean valueof(boolean b){
         return b?Boolean.true:Boolean.false;
    }

2.不New更高效

    第二个优势在于静态方法每次调用时都不必去创建一个新的对象,相比于new()一个对象出来,而且你无法保证它不重复使用,后果就是带来高昂的开销。Effictive java说的更清楚:“静态工厂方法能够为重复的调用返回相同对象,这样有助于类总能严格控制在某个时刻哪些实例应该存在,这种类被称为实例受控的类(instance-controlled)”,避免了存在两个相等的实例,类如果保持了这一点,能有效地提升性能。过多的创建不必要的重复对象,不仅让代码变得冗余,也会给代码的互查工作带来不必要的苦恼,当然更重要的原因是它也不利于整个项目的性能。

3.返回更灵活

   Effictive java 上的原话是“静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象”。乍看一下有点拗口,也一时没理解。先上个实例代码
  public interface Service{
    ...//service methods
  }
  public interface Provider{
    Service newService(); 
    Provider(){
        //构造器
    }
  }
  public class Services{
     public static Service newInstance(){
         Provider p = new Provider();
         return p.newService();
     }
  }

对于构造器而言,返回的只能是Provider对象,而对于静态方法,它返回了Service对象,在返回类型的选择上比构造器更加灵活和多样。(在这一点上LZ可能理解地不是特别深,大家有意见或者更好的看法,欢迎大家留言,谢谢)

4.简洁就是效率

   对于代码的初学者来说,
Map<String,List<String>> m = new HashMap<String,List<String>>();

一定不陌生,你会发现当你类型参数越来越长的时候,这段代码会变得非常的复杂,冗余甚至让你痛苦。但如果HashMap提供了静态工厂:

public static <K,V>HashMap<K,V> newInstance(){
    return new HashMap<K,V>();
}

那你以后的声明就变成了:

Map<String,List<String>> m = HashMap.newInstance();

怎么样,代码是不是简洁很多?在大家以后创建自己常用的工具类的时候,可以参考此类方法,代码也会写的非常地漂亮,让人赏心悦目。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值