</p> finalize( )的动作使得bug被发现,那你就可据此找出问题地址——这才是你真正关心的。
( S3 O, l# ]) _& j9 t. w3 z 以下是个简单的例子,示范了可能的使用体例:" F( d+ V4 X# |) m" p ~) o9 Y* z* ?
class Book {
/ R* q7 U* e8 a2 n( v' N( y6 J boolean checkedOut = false;* l% U, o z! l" G
Book(boolean checkOut) {
5 _% j5 ?7 l2 q+ a checkedOut = checkOut;3 |$ T$ T2 N! ]1 m4 Y9 ]
}5 r$ r# H; O! t% R
void checkIn() {
" ]: a% w3 a: n checkedOut = false;
; L( a5 x7 p2 a( w+ Y" R }3 v: R/ V& d2 q: q
public void finalize() {
2 F' a# n. R! M i. |# B0 w if(checkedOut)& Z. F) @, t: {# {, V
System.out.println("Error: checked out");( y7 t. n3 f: B/ u3 _
// Normally, you'll also do this:
+ W" a+ _, K) C% x& W0 x/ X( U7 W // super.finalized();# ~7 X* b' g( g0 y8 g
}( ^* |& H( ?% D/ B, J0 V( t4 S
}
( R5 o& Y a3 q' B8 T- h; S! Y public class TerminationCondition {
8 r: z5 e! A6 l) S5 G6 } public static void main(String[] args) {
2 D4 ^% X8 e$ K1 K3 n Book novel = new Book(true);+ i) M( \0 x' D( s8 m9 ~5 N$ b7 e
// Proper cleanup:
3 h( b# P3 U( O) E& Z2 Y z4 ` novel.checkIn();
6 Y' F! v" I1 X$ F( {0 s. f! J // Drop the reference, forget to clean up:" ^8 M( p3 V* B& ?, C6 L. P" m' u
new Book(true);
4 M2 ~6 |) v, B7 m" G$ `. R) N& l3 @2 Q; _ // Force garbage collection & finalization:9 w" v' b1 B5 ~' A6 f0 v# y7 v0 q
System.gc();: z8 }- e8 ~" r% W% s) `
}; c* _& [ ~. [* s
}
* |# U0 o+ f Q3 T% q 本例的终结前提是:所有的Book对象在被算作垃圾收受接管前都应该被签入(check in)。但在main( )体例中,因为轨范员的错误,有一本书未被签入。若是没有 finalize( )来验证终结前提,将很难发现这种错误。
& V& P; X; F" C4 n w% { 注重,System.gc( )用于强制终结动作的进行。即使不这么做的话,经由过程一再的执行轨范(假设轨范将分配年夜量的存储空间而导致垃圾收受接管动作的执行),最终也能找犯错误的Book对象。 |