原创文章,转载请注明出处:http://blog.csdn.net/wind5shy/article/details/5349671
附录A对象的调用及返回
(By wind5shy:http://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 wind5shy:http://blog.csdn.net/wind5shy)
附录B Java编程指南
(By wind5shy:http://blog.csdn.net/wind5shy)
设计
n 优雅终将得到回报。
n 先能运行,再求快速。
n 分而治之。
n 类名清晰让注释多此一举。
n 类原子化。
n 需要向上转型使用继承,否则使用组合。
n 字段表示数值的变化,方法重载表示行为的变化。
实现
n 不用过早优化。
n 编制通用性类,遵守标准形式:定义equals()、hashCode()、toString()、clone(),实现Cloneable、Comparable和Serialiable接口。
n 获得或改变私有成员的方法,使用set、get、is命名。
n 用ArrayList处理顺序结构,HashSet处理集合,HashMap处理关联数组,LinkedList处理栈,前三者向上转型为List、Set和Map。
n 避免魔术数字。
n 避免在构造器内调用其他方法。
n 基类优先考虑为接口,在必须定义成员或方法时改为抽象类。
(By wind5shy:http://blog.csdn.net/wind5shy)