欢迎来到天天文库
浏览记录
ID:6141370
大小:4.31 MB
页数:32页
时间:2018-01-04
《effective java读书笔记(上)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、EffectiveJava第一章引言第二章创建/销毁对象1.用静态工厂方法代替构造器2.类提供一个共有的静态工厂方法,返回类的实例。3.注意:与工厂模式不同,并不直接对应。4.静态工厂方法比起构造器的优势a)它们有名称:i.如果构造器的参数不能正确描述正被返回的对象,具有适当名称的静态方法更容易使用。ii.当一个类需要多个带有相同签名的构造器时,就可以用静态工厂代替构造器例子:BigInterger.probablePrime()b)不必每次调用它们的时候都创建新的对象:单件模式或者享元模式。i.静态工厂方法能为重复的调用返回相同的类,有助于类控制在哪个时间段存在
2、哪些实例。被称为实例受控的类。c)他们可以返回原返回类型的的任何子类型的实例。i.API可以返回对象,又不会使对象的类变成共有的,适合基于接口的框架。ii.被返回的对象由相关的借口精确指定。iii.共有的静态工厂方法所返回的类不仅可以是非公有的,还可以随着每次调用发生变化,这取决于工厂方法参数值。iv.静态工厂方法返回的对象所属的类,在编写该静态方法时可以不必存在(留给开发者实现)d)在创建参数化实例的时候,它们使代码更为简单i.例子:Map>m=newMap>();Map3、g,List>m=HashMap.newInstance();//减少一次参数5.静态工厂方法的缺点a)类如果不含公有或者受保护的构造器,就不能被子类化。i.可能鼓励程序员使用复合,而非继承b)它们与其他静态方法没有任何区别。i.要想查明如何实例化一个类是非常困难的ii.静态工厂方法的惯用名称1.ValueOf:类型转换方法2.getInstance:返回唯一的实例1.newInstance:保证每个返回的实例都与其他不同2.getType/newType:返回工厂对象的类2.遇到多个构造器参数时要考虑构建器(建造者模式)1.重叠构造器模式:第一个4、构造器只有一个必要参数,第二个有一个可选参数,第三个有两个,以此类推,最后一个构造器有全部的可选参数。创建实例的时候,选择最短的列表参数的构造器结论:当有许多参数的时候,客户端代码会很难编写2.JavaBeans模式:调用一个无参数构造器来创建对象,然后用setter方法设置每个必要的参数评价:有严重的缺点,构造过程被分配到几个过程中,JavaBean可能处于不一致的状态。需要程序员付出额外的努力来确保它的线程安全。3.建造者方法:既能保证安全性,又能保证可读性。最好一开始就使用Builder模式.先调用类的builder方法创建一个builder,再用sette5、r设置各个参数(注意使用returnthis;可以构造参数链),最后调用builder返回一个类a)Builder可以进行域的检查,是否违反约束条件b)Builder可以有多个可变参数c)Builder方法可以自动填充域,也可以返回不同的对象d)使用泛型的buildere)Java传统的抽象工厂实现是Class对象,用newInstance()来build。评价:newInstance()会主动调用无参数的构造函数,而且没有编译时错误,只能在runtime抛出异常。这破坏了编译时的异常检查。f)Builder模式的不足之处:必须先构建Builder对象。可能有性能6、问题,必须在有很多参数时才适合使用。3.用私有构造器或者枚举类型强化Singleton属性a)注意客户端可以使用反射机制来调用私有的构造方法:应该在类被要求创造第二个实例的时候抛出异常AccessibleObject.setAccessble()b)公有属性的好处:组成类的成员的声明很清楚地表明了这个类是一个Singletonc)工厂方法的好处:它提供了灵活性。在不改变API的前提下可以改变该类是否为Singleton的想法,或者修改成每一个调用的线程都返回一个唯一的实例。d)序列化:仅仅加上implementsSerializable是不够的,需要所有域都是瞬时7、的,而且提供一个readResolve()方法防止假冒对象。e)编写单个元素的枚举类型:更加简洁,无偿提供序列化机制,而且绝对防止多次实例化,是目前最好的方法。4.通过私有构造器强化不可被实例化的类的特性a)让工具类包含私有构造器,应该加上注释b)副作用:使该类不能被子类化3.避免创建不必要的对象a)如果对象不可变,就始终可以重用。错误的代码:会创建不必要的String实例b)对于同时提供了静态工厂和构造器的不可变类,通常使用静态工厂而不是构造器,以避免创建不必要的对象例子:Boolean.valueOf(String)总是优先于Boolean(String)c)8、重用一直不
3、g,List>m=HashMap.newInstance();//减少一次参数5.静态工厂方法的缺点a)类如果不含公有或者受保护的构造器,就不能被子类化。i.可能鼓励程序员使用复合,而非继承b)它们与其他静态方法没有任何区别。i.要想查明如何实例化一个类是非常困难的ii.静态工厂方法的惯用名称1.ValueOf:类型转换方法2.getInstance:返回唯一的实例1.newInstance:保证每个返回的实例都与其他不同2.getType/newType:返回工厂对象的类2.遇到多个构造器参数时要考虑构建器(建造者模式)1.重叠构造器模式:第一个
4、构造器只有一个必要参数,第二个有一个可选参数,第三个有两个,以此类推,最后一个构造器有全部的可选参数。创建实例的时候,选择最短的列表参数的构造器结论:当有许多参数的时候,客户端代码会很难编写2.JavaBeans模式:调用一个无参数构造器来创建对象,然后用setter方法设置每个必要的参数评价:有严重的缺点,构造过程被分配到几个过程中,JavaBean可能处于不一致的状态。需要程序员付出额外的努力来确保它的线程安全。3.建造者方法:既能保证安全性,又能保证可读性。最好一开始就使用Builder模式.先调用类的builder方法创建一个builder,再用sette
5、r设置各个参数(注意使用returnthis;可以构造参数链),最后调用builder返回一个类a)Builder可以进行域的检查,是否违反约束条件b)Builder可以有多个可变参数c)Builder方法可以自动填充域,也可以返回不同的对象d)使用泛型的buildere)Java传统的抽象工厂实现是Class对象,用newInstance()来build。评价:newInstance()会主动调用无参数的构造函数,而且没有编译时错误,只能在runtime抛出异常。这破坏了编译时的异常检查。f)Builder模式的不足之处:必须先构建Builder对象。可能有性能
6、问题,必须在有很多参数时才适合使用。3.用私有构造器或者枚举类型强化Singleton属性a)注意客户端可以使用反射机制来调用私有的构造方法:应该在类被要求创造第二个实例的时候抛出异常AccessibleObject.setAccessble()b)公有属性的好处:组成类的成员的声明很清楚地表明了这个类是一个Singletonc)工厂方法的好处:它提供了灵活性。在不改变API的前提下可以改变该类是否为Singleton的想法,或者修改成每一个调用的线程都返回一个唯一的实例。d)序列化:仅仅加上implementsSerializable是不够的,需要所有域都是瞬时
7、的,而且提供一个readResolve()方法防止假冒对象。e)编写单个元素的枚举类型:更加简洁,无偿提供序列化机制,而且绝对防止多次实例化,是目前最好的方法。4.通过私有构造器强化不可被实例化的类的特性a)让工具类包含私有构造器,应该加上注释b)副作用:使该类不能被子类化3.避免创建不必要的对象a)如果对象不可变,就始终可以重用。错误的代码:会创建不必要的String实例b)对于同时提供了静态工厂和构造器的不可变类,通常使用静态工厂而不是构造器,以避免创建不必要的对象例子:Boolean.valueOf(String)总是优先于Boolean(String)c)
8、重用一直不
此文档下载收益归作者所有