effect java_《Effect Java》学习笔记1———创建和销毁对象

第二章 创建和销毁对象

1.考虑用静态工厂方法代替构造器

四大优势:

i. 有名称

ii. 不必在每次调用它们的时候都创建一个新的对象;

iii. 可以返回原返回类型的任何子类型的对象;

JDBC(Java Database Connectivity)

服务提供者框架(Service Provider Framework)

服务接口、提供者注册API、服务访问API、服务提供者接口(负责创建其服务实现的实例);

iv. 在创建参数类型实例的对象,它们使代码变得更加简洁

下面是一个Boolean(基本类型boolean的包装类)的基本实现:

public static Boolean valueOf(booleanb) {return b ?Boolean.TURE : Boolean.FALSE;

}

美中不足处:

① 类如果不会含公有的或者受保护的构造器,就不能被子类化

② 与其他的静态方法实际上没有区别

常用的名称:

valueOf  of  getInstance  newInstance  getType  newType

2.遇到多个构造器参数时,要考虑使用构造器

class.newInstance 破坏了编译时的异常检查(Builder弥补不足)

总:如果类的构造器或静态工厂中具有多个参数,考虑用Builder模式;

下面是示例:

1 //Builder Pattern

2 public classNutritionFacts3 {4 private final intservingSize;5 private final intservings;6 private final intcalories;7 private final intfat;8 private final intsodium;9 private final intcarbohydrate;10

11 public static classBuilder12 {13 //Required parameters

14 private final intservingSize;15 private final intservings;16

17 //Optional parameters - initialized to default values

18 private int calories = 0;19 private int fat = 0;20 private int carbohydrate = 0;21 private int sodium = 0;22

23 public Builder(int servingSize, intservings)24 {25 this.servingSize =servingSize;26 this.servings =servings;27 }28

29 public Builder calories(intval)30 { calories = val; return this; }31

32 public Builder fat(intval)33 { fat = val; return this; }34

35 public Builder carbohydrate(intval)36 { carbohydrate = val; return this; }37

38 publicNutritionFacts build() {39 return new NutritionFacts(this);40 }41 }42

43 privateNutritionFacts(Builder builder) {44 servingSize =builder.servingSize;45 servings =builder.servings;46 calories =builder.calories;47 }48 }

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

单元素的枚举类型已经成为实现Singleton的最佳方法

实现方式一:公有静态成员是一个final域

//Singleton with public final field

public classElvis {public static final Elvis INSTANCE = newElvis();privateElvis() {......}public voidleaveTheBuilding() {......}

}

实现方式二:  公有的成员是个静态工厂方法

//Singleton with static factory

public classElvis {private static final Elvis INSTANCE = newElvis();privateElvis() {......}public static Elvis getInstance() { returnINSTANCE;}public voidleaveTheBuilding() {......}

}

实现方式三(最佳实现方式):

只需编写一个包含单个元素的枚举类型;

这种方法在功能上与公有域方法相近,当是它更加简洁,无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。

//Enum singleton - the preferred approach

public enumElvis {

INSTANCE;public voidleaveTheBuilding() {......}

}

4.通过私有化构造器强化不可实例化的能力

throw new AssertionError(); (构造器内)

可在上面加入注释,便于理解,如下:

suppress default coustructor for noninstratiability.

示例如下:

//Noinstantialbe utility class

public classUtilityClass {//Suppress default constructor for noninstiability

privateUtilityClass() {throw newAssertionError();

}

......//Remainder omitted

}

5.避免创建不必要的对象

update。。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值