來自於 think in java
import static org.print.Print.*;
class Shared{
private int refcount=0;
private static long counter=0; // 跟蹤實例對象
private final long id=counter++; //id定義爲final,不希望它的值在對象的生命週期內被改變
public Shared(){ print("creating "+this); }
public void addRef(){ refcount++; } //當有一個對象附到類上時,調用addRef()
protected void dispose(){
if(--refcount==0)
print("Disposing "+ this);
}
protected void finalize(){
if(refcount != 0 ){ print("Error: object os not proper clean-up!");} //校驗終止條件,當有對象引用,不允許清理;
}
public String toString(){ return "Shared "+id; }
}
class Composing{
private Shared shared;
private static long counter=0;
private final long id=counter++;
public Composing(Shared shared){
print("creating "+this);
this.shared=shared;
this.shared.addRef();
}
protected void dispose(){
print("disposing "+ this);
shared.dispose();
}
public String toString(){ return "composing "+id;}
}
public class ReferCounting {
public static void main(String[] args){
Shared shared=new Shared();
Composing[] composing={
new Composing(shared),
new Composing(shared),
new Composing(shared),
new Composing(shared),
new Composing(shared)
};
for(Composing c:composing)
c.dispose();
System.gc();
new Composing(new Shared());
System.gc();
}
}
output:
creating Shared 0
creating composing 0
creating composing 1
creating composing 2
creating composing 3
creating composing 4
disposing composing 0
disposing composing 1
disposing composing 2
disposing composing 3
disposing composing 4
Disposing Shared 0
creating Shared 1
creating composing 5
Error: object os not proper clean-up!
可以看出使最後一個composing對象存活,報錯!