第一部分 一般技术
实践 1 :
参数以 by value 方式而非 by reference 方式传递。
实践 2 :
对不变的 data 和 object reference 使用 final 。注意, final 仅仅令 object erference 自身成为不变量,并不限制它所指对象的改变。
实践 3 :缺省情况下所有 non-static 函数都可以被重写。
实践 4 :在 arrays 和 vectors 之间慎重选择。
实践 5 :多态 polymorphism 优于 instanceof 。
instanceof 的许多用途都会因为改用多态而消失。使用多态,代码将更清晰、更易于扩展和维护。
实践 6 :必要时才使用 instanceof 。
实践 7 :一旦不再需要 object reference ,就将它设为 null 。
第二部分 对象与相等性
实践 8 :区分 reference 类型和 primitive 类型。
实践 9 :区分 == 和 equals() 。
== 用来测试基本类型的相等性,亦可判定两个 object reference 是否指向同一个对象 。
实践 10 :不要依赖 equals() 的缺省实现。
实践 11 :实现 equals() 时必须深思熟虑。
如果某个 class 所生的两个对象,即使不占用相同的内存空间,也被视为在逻辑上相等,那么需要为该类提供一个 equals() 。
实践 12 :实现 equals() 优先考虑使用 getClass() ,属于同一种类型才有可能相等。
实践 13 :调用 super.equals() 以唤起 base class 的相关行为。任何基类如果实现 equals() ,其继承类都应该调用 super.euals() 。
实践 14 :在 equals() 函数中谨慎使用 instanceof 。唯有考虑允许一个继承类对象可以相等于其基类对象时,才在 equals() 中使用 instanceof 。
实践 15 :实现 equals() 时遵循某些规则。
第三部分 异常处理
实践 16 :认识异常控制流( exception control flow )机制。
实践 17 :绝对不可以忽视异常( Never ignore an exception )。
实践 18 :千万不要遮掩异常 (Never hide an exception) 。
如果在处理异常期间又从 catch 或 finally 区段抛出异常,原先的异常会因而被隐藏起来。
实践 19 : 明察 throws 子句的缺点。将一个异常加入某函数的 throws 子句,会影响该函数的所有调用者。
实践 20 :细致而全面地理解 throws 子句。
实践 21 :使用 finally 避免资源泄漏 (resource leaks) 。
实践 22 :不要从 try 区段中返回,因为函数未必会立即从那里返回。如果存在 finally 区段,它应付被运行起来并可能改变回传值。
实践 23 :将 try/catch 区段置于循环之外。
实践 24 :不要将异常 exception 用于流程控制。
实践 25 :不要每逢出错就使用异常,只有面对程序行为可能出乎意料的情况下才使用异常。
实践 26 :构造函数并非真正函数,不能进行回传,如果构造失败请抛出异常
实践 27 :抛出异常之前先将对象恢复为有效状态。
第四部分 性能
实践 28 :先把焦点放在设计、数据结构和算法上。
实践 29 :不要依赖编译期优化技术。
实践 30 :理解运行期代码优化技术。
实践 31 :如欲进行字符串连接操作, StringBuffer 要比 String 快许多倍。
实践 32 :将对象的创建成本降至最小。
实践 33 :慎防未用上的对象。
实践 34 :将同步化降至最低, synchronized 函数和区段会显著降低性能。
实践 35 :尽可能使用 static 变量。
实践 36 :使用 static 、 final 和 private 函数以促成 inlining 。
实践 37 : instance 变量的初始化一次就好。
实践 38 :使用基本类型( primitive types )使代码更快更小。
实践 39 :不要使用 Enumberation 或 Iterator 来遍历 Vector ,而使用其 get() 函数。
实践 40 :使用 System.arraycopy() 来复制 arrays 。
实践 41 :优先使用 array ,然后才考虑 ArrayList 和 Vector 。
实践 42 :尽可能复用对象。
实践 43 :使用延迟加载,构造函数尽可能简洁。
实践 44 :以手工方式将代码优化:删除空白函数;删除无用代码;削减强度,使用一元表达式;合并常量;删除相同的子表达式;展开循环;简化代数;移动循环内的不变式。
实践 45 :编译为本机代码,可以获得更快速度。
第五部分 多线程
实践 46 :面对 instance 函数, synchronized 锁定的是对象而非函数或代码。一个函数或程序区段被声明为 synchronized ,并不意味同一时刻只能由一个线程运行它。
实践 47 :弄清楚 synchronized statics 函数与 synchronized instance 函数之间的差异。
实践 48 :以 private 方式保护要同步的数据,确保同步机制。
实践 49 :避免无谓的同步控制,采用“单对象多锁”技术以允许更多并发动作。
实践 50 :访问共享变量时请使用 synchronized 或 volatile 。
实践 51 :在单一操作中锁定所有用到的对象。
实践 52 :同步化多个对象时,以固定而全局性的顺序取得多个 locks 以避免死锁。
实践 53 :优先使用 notifyAll() 而非 notify() 。
实践 54 :针对 wait() 和 nofityAll() 使用旋锁 (spin locks) 。
实践 55 :使用 wait() 和 notifyAll() 替换轮询 (polling loops) 。
实践 56 :不要对锁定对象的对象引用重新赋值。
实践 57 :不要调用 stop() 或 suspend() 。
实践 58 :通过线程之间的协作来中止线程。
第六部分 类与接口
实践 59 :运用 interface 支持多继承。
实践 60 :避免 interface 中的函数发生冲突。
实践 61 :如需提供部分实现,使用 abstract 抽象类。
实践 62 :区分 interface 、 abstract class 和 concrete class 。
实践 63 :审慎地定义和实现不可变类。
实践 64 :欲传递或接收可变对象的对象引用时,请实施 clone() 。
实践 65 :使用继承或委托来定义不可变类。
实践 66 :实现 clone() 方法时记得调用 super.clone() 。
实践 67 :别只依赖 finalize() 清理内存以外的资源,应专门实现一个函数来处理。
实践 68 :在构造函数内调用 non-final 函数时要当心。