再读《Java编程思想》(Review 《Thinking in Java 3rd》)(附录A、B)

原创文章,转载请注明出处:http://blog.csdn.net/wind5shy/article/details/5349671

附录A对象的调用及返回

(By wind5shyhttp://blog.csdn.net/wind5shy)

制作局部拷贝

n      传“对象”实际上是传引用,指向存活于方法外的对象。

n      别名效应在参数传递时自动发生。

n      方法内没有局部对象,只有局部引用。

n      对象没有作用域,只有引用有作用域。

n      不对对象进行修改,使用缺省的“传引用”方式。如果要修改而又不想影响方法外的对象,就需要制作一个副本供方法内局部使用。

 

Clone

clone的目的是为了复制对象,即创建对象的副本。

 

浅层拷贝:将对象按位复制创建副本,副本对象与原对象包含的对象网(所有引用指向的对象及这些对象又指向的对象)相同。直接从Object类继承clone()不做其他处理即为浅层拷贝。

 

深层拷贝:将对象复制并将其包含的对象网复制,即对象网中的每个对象都创建副本,实现了深层拷贝的clone才是真正的clone

对于List等对象来说,由于其成员都是对象,所以其默认clone()相当于别名。用clone()复制一个List的时候需要深层拷贝即对其成员对象一一clone

 

Object.clone()按位复制对象,并且为protected,所以在自己的类中的clone()应该:

1.      调用super.clone()。一般将其写作try{}内,因为Object.clone()在执行操作前会检查被clone的类能被clone,即是否实现了实现Cloneable接口。如果没有则会抛出CloneNotSupportException

2.      将自己的clone()声明为public,这样才能在所有类中使用。

3.      实现Cloneable接口,该接口为标记接口,无具体方法,所以只需在类声明后加上implement Cloneable即可。

4.      如果需要深层拷贝,需要对对象包含的对象网中的对象进行进一步处理,全部创建副本。

 

一但某个类拥有了克隆能力,其所有子类也相应拥有了克隆能力。关闭子类的克隆能力Java建议是在子类的clone()中抛出CloneNotSupportException,该子类的子类在调用super.clone()时就会抛出CloneNotSupportException从而阻止clone。更绝的方式是将类声明为final,其不能被继承自然不能被clone

 

拷贝构造器

Java中用拷贝构造器不能达到clone的效果,CopyConstructor的例子中ripen()slice()未能提供保存对象类型的机制,所以返回的对象只能为声明的对象而不能多态为对象正确的类型。ripen2()slice2()中则保存了参数对象的类型,所以能正确的返回对象类型。

 

只读类

类中不提供改变其对象内容(成员)的方法或提供这些方法但均返回新的对象,可以防止别名的副作用。所有基本类型的包装类及String都是只读类。包装类没有改变其对象的方法,String有,不过这些方法返回的都是新的String对象。对于String的“+”和“+=”是Java中仅有的重载操作符,且Java不允许自定义其他的重载操作符。(重载操作符:对于不同的类型,相同的符号有不同的意义。)

(By wind5shyhttp://blog.csdn.net/wind5shy)

 

附录B Java编程指南

(By wind5shyhttp://blog.csdn.net/wind5shy)

设计

n      优雅终将得到回报。

n      先能运行,再求快速。

n      分而治之。

n      类名清晰让注释多此一举。

n      类原子化。

n      需要向上转型使用继承,否则使用组合。

n      字段表示数值的变化,方法重载表示行为的变化。

 

实现

n      不用过早优化。

n      编制通用性类,遵守标准形式:定义equals()hashCode()toString()clone(),实现CloneableComparableSerialiable接口。

n      获得或改变私有成员的方法,使用setgetis命名。

n      ArrayList处理顺序结构,HashSet处理集合,HashMap处理关联数组,LinkedList处理栈,前三者向上转型为ListSetMap

n      避免魔术数字。

n      避免在构造器内调用其他方法。

n      基类优先考虑为接口,在必须定义成员或方法时改为抽象类。

(By wind5shyhttp://blog.csdn.net/wind5shy)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值