eff java_Effactive Java -- 创建和销毁对象

静态工厂方法代替构造器

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

不必每次调用他们的时候都去创建一个对象;

有名称;

创建参数化类型实例的时候,使得代码更加简洁。

静态工厂方法的缺点:

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

与其他的静态方法实际上没有任何区别。

2c62c38448f1389fdd2bdc2b4426d9ef.png

遇到多个构造器参数的时候考虑使用builder模式

利用javaBean的set方法来设置;

最佳方法:使用Builder模式来构造多参数的类对象。

builder模式优点:

灵活,可以利用单个builder构建多个对象;

可以在创建对象期间进行调整,也可以随着不同对象改变。

public classNutritionFacts {private final intservingSize;private final intservings;private final intcalories;private final intfat;private final intsodium;private final intcarbohydrate;public static classBuilder {//Required parameters

private final intservingSize;private final intservings;//Optional parameters - initialized to default values

private int calories = 0;private int fat = 0;private int carbohydrate = 0;private int sodium = 0;public Builder(int servingSize, intservings) {this.servingSize =servingSize;this.servings =servings;

}public Builder calories(intval) {

calories=val;return this;

}public Builder fat(intval) {

fat=val;return this;

}public Builder carbohydrate(intval) {

carbohydrate=val;return this;

}public Builder sodium(intval) {

sodium=val;return this;

}publicNutritionFacts build() {return new NutritionFacts(this);

}

}privateNutritionFacts(Builder builder) {

servingSize=builder.servingSize;

servings=builder.servings;

calories=builder.calories;

fat=builder.fat;

sodium=builder.sodium;

carbohydrate=builder.carbohydrate;

}public static voidmain(String[] args) {

NutritionFacts cocaCola= new NutritionFacts.Builder(240, 8)

.calories(100).sodium(35).carbohydrate(27).build();

}

}

用私有构造器或者枚举类型强化单利

使用枚举:

public enumElvis {

INSTANCE;public voidleaveTheBuilding() {

System.out.println("Whoa baby, I'm outta here!");

}//This code would normally appear outside the class!

public static voidmain(String[] args) {

Elvis elvis=Elvis.INSTANCE;

elvis.leaveTheBuilding();

}

}

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

public classUtilityClass {//Suppress default constructor for noninstantiability

privateUtilityClass() {throw newAssertionError();

}

}

子类继承报错,其他类调用也会出错。

68063acc9c534c9e96c52fc2cd9470b2.png

避免创建不必要的对象

能重用对象绝不创建新对象。

优先使用基本类型而不是装箱基本类型,要当心无意义的自动装箱。

classPerson {private finalDate birthDate;publicPerson(Date birthDate) {//Defensive copy - see Item 39

this.birthDate = newDate(birthDate.getTime());

}//Other fields, methods

/*** The starting and ending dates of the baby boom.*/

private static finalDate BOOM_START;private static finalDate BOOM_END;static {

Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));

gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);

BOOM_START = gmtCal.getTime();

gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);

BOOM_END = gmtCal.getTime();

}public booleanisBabyBoomer() {return birthDate.compareTo(BOOM_START) >= 0

&& birthDate.compareTo(BOOM_END) < 0;

}

}

消除过期对象的引用

一旦引用过期,就需要对引用进行清空。

使用weakHashMap代表缓存,当缓存过期,自动删除。

确保回调立即被当做垃圾回收的最佳方法是保持它们的弱引用。

避免使用终结方法

终结方法不可预测,很危险,不必要。

java语言不保证终结方法及时执行,不保证会被执行。能够保证终结方法被执行的方法是System.runFinalizersOnExit(),Runtime.runFinalizersOnExit()。

使用终结方法存在严重的性能问题。

显示终止方法例子:IO流中的close方法。Timer的cannel方法。

如果使用终结方法,也要记住调用super.finalize。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值