effectivejava-第二章

1、 用静态工厂方法代替构造器
1、 第一大优势在于,它们有名称。(理解的意思可以当作构造器可以完成对象构建,但是,因为一个类只能有一个带有指定签名的构造器,如果需要实例化不同的对象,就需要创建多个不同参数列表的构造器。但是静态方法就可以通过名称去解决这个问题)
2、 第二大优势在于,不必在每次调用它们的时候去创建一个新的对象(可以使用预先创建好的实例,或者将构建好的实例缓存起来,进行重复利用
3、 第三大优势在于,它们可以返回原返回类型的任何子类型的对象(比如Collections里面的方法,都是通过传入的List接口,而最后返回的是list的子类)
4、 第四大优势在于,所返回的对象的类可以随着每次调用发送变化,这取决于静态工厂方法的参数值(只要是已声明的返回类型的子类型,都是被允许的,返回对象的类也可能随着发行版本的不同而不同,比如EnumsSet类,方法里面没有构造器,都是静态工厂方法,noneOf工厂方法会根据入参的类型去比较,如果元素又64个或者更少,会返回一个RegalarEumSet实例,用单个long进行支持,如果枚举元素又65个或者更多,会返回一个JumBoEnumSet实例,用一个long数组进行支持)
5、 第五大优势在于,方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在(引入服务提供者框架来解释,多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把它们从多个实现中解耦出来)
2、 遇到多个构造器参数时要考虑使用构建器,
1、 一般情况下都会采用重叠构造器,就是可选参数构造器加上N个不可选参数的构造组成重叠构造器,然后,每级构造器都可向上调用构造器,
2、 重叠构造器模式可行,但是当有许多参数的时候,客户端代码会很难编写,并且仍然难以阅读。
3、 第二种方法是通过JavaBean模式,给出一个午餐构造器,然后通过setter方法去设置每个必要的参数,在构造过程中JavaBean可能处于不一致的状态。JavaBean模式使得把类做成不可变的可能性不复存在
4、 第三种替代方法建造者模式(Builder)的一种形式,它不直接生成对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个builder对象,然后客户端再builder对象上调用类似于setter的方法,来设置每个相关的可选参数,最后,客户端调用无参的build方法来生成通常是不可变的对象,这个builder通常是它构建的类的静态成员类。
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
.calories(100).sodium(35).carbohydrate(27).build();这是建造者模式初始化对象的方式,Builder静态类里面定义了不必选参数的默认值,实例化时可以填入必选参数后,选择初始化不必要的字段即可。Builder模式模拟了具名的可选参数
5、 Builder模式也适用于类层次结构
6、 总结:如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式就是一种不错的选择
3、 用私有构造器或者枚举类型强化singleton属性
4、 Try-with-resources优先于try-finally
static String firstLineOfFile(String path, String defaultVal) {
try (BufferedReader br = new BufferedReader(
new FileReader(path))) {
return br.readLine();
} catch (IOException e) {
return defaultVal;
}
}
在处理需要关闭的资源时,始终优先考虑用try-with-resources,而不是用try-finally。这样得到的代码将更加简洁、清晰,产生的异常也更有价值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值