第2章 创建和销毁对象

第1条 用静态工厂方法代替构造器

优点

1.静态工厂方法与构造器不同的第一大优势在于,他们有名称
2.不必每次调用他们都创建一个新对象,如Boolean中的valueof,都是内部自己维护的两个单例,根据传入的参数不同,分别返回True或者False

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);

public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);

3.返回原返回类型的任何子类型的对象,API可以返回对象,同时又不会使对象的类变成公有(这里理解为Collections【Collections的构造器为private】中的东西,里面有很多静态内部类,通过暴露静态公有的方法创建无法new出来的对象)
4.所有返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值
5.方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在(理解为解耦,可以先没有具体的实现类,如JDBC返回Connection)

缺点

1.类如果不含有公有的或者受保护的构造器,就不能被子类化(可能意思是如果构造函数私有,那么无法通过静态方法创建对象,而需要类自己去创建然后暴露给外部)
2.程序员很难发现他们,API 文档中,它没有像构造器那样在 API 文档中明确标识出来,对于提供了静态工厂方法而不是构造器的类来说,要想查明如何实例化类是非常困难的

第2条 遇到多个构造器参数时要考虑使用构建器

遇到多个构造器参数时要考虑使用建造器,写多个构造器太麻烦,虽然可以采用JeanBeans模式(就是创建一个无参对象之后,疯狂的set),但是因为构造过程被分到了几个调用中,可能在构造过程中处于不一致状态(这个我也不是很理解,可能是通过同一个构造器new出来的实例,setter会导致它们的属性不一致),也使得把类做成不可变的可能性不复存在,这就需要程序员付出努力来确保它的线程安全,所以还是要用建造者模式

优点

灵活,易于阅读,编写,也比用JavaBean安全

缺点

为了创建对象,必须先创建它的构建器,冗长,只有在很多参数时才使用(4个或以上)

第3条 用私有构造器或者枚举类型强化 Singleton 属性

1.序列化记得提供readResolve方法,防止每次反序列化出现新的实例
2.用枚举,它无偿提供了序列化机制,在面对复杂的序列化或反射攻击时,能够有效防止多实例
3.枚举可以实现接口,但不能继承类,因为所有枚举都继承自java.lang.Enum(由编译器添加),同时java不支持多继承
4.Enum类实现了Serializable接口,即所有的enum类都实现了序列化,还有Comparable接口
5.非抽象的枚举类默认会使用final修饰,因此不能派生子类
6.枚举类的构造器只能使用 private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定 private修饰符
7.枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加 public static final修饰,无须程序员显式添加
8.枚举可以有抽象方法
枚举类型的抽象
关于枚举类中实现自定义抽象方法的问题 这个链接主要是能看到定义了抽象方法的枚举的反编译代码,发现是个抽象类,正常的反编译应该是final修饰的,这个由于有抽象方法,所以是抽象类,会被abstract修饰,没有final
(以上的都是基于单例然后查阅关于枚举后的一些扩展,与这条建议内容关系不大)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值