`

改善代码的68个原则(Practical Java )

阅读更多

 

 

第一部分 一般技术

实践 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 函数时要当心。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics