Thinking in Java(8)-inheritance and cleanup

来源:互联网 发布:python 月份加减 编辑:程序博客网 时间:2024/05/16 01:37

大家都知道,在继承中,不共享变量时,Java类对象initialize的顺序和cleanup的顺序相反,但是共享变量时情况就比较复杂了,这时使用一个final变量跟踪引用是一个好方法,可以清楚地看到对象的initialize和cleanup情况:

class Shared{    private int refcount = 0;    private static long counter = 0;    private final long id = counter++;    public Shared ()    {        System.out.println(" Creating" + this);    }    public void addRef()    {        refcount++;    }    protected void dispose()    {        if (--refcount == 0)            System.out.println("Disposing " + this);    }    public String toString()    {        return ("Shared " + id);    }    protected void finalize() {        if(refcount != 0)            System.out.println("Error: object is not properly cleaned-up!");}}class Composing{    private Shared shared;    private static long counter = 0;    private final long id = counter++;    public Composing(Shared shared)    {        System.out.println("Creating " + this);        this.shared = shared;        this.shared.addRef();    }    protected void dispose()    {        System.out.println("disposing " + this);        shared.dispose();    }    public String toString()    {        return ("Composing " + id );    }}public class ReferenceCounting {    public static void main(String[] args) {        // TODO Auto-generated method stub        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();        // Verify failure:        new Composing(new Shared());        System.gc();    }}
1 0
原创粉丝点击