您的位置:首页 > 编程语言 > Java开发

Thinking in Java(7)-Guaranteeing proper cleanup

2016-11-02 16:50 274 查看
You can’t know when the garbage collector will be called,or if it will be called. So if you want something cleaned up for the class,you must explicitly write a special method to do it,and make sure that client programmer knows that they must call this method.

Consider an example of a computer-aided design system that draws pictures on the screen:

class Shape{
Shape(int i) {
System.out.println("Shape constructor");
}
void dispose() {
System.out.println("Shape dispose");
}
}

class Circle extends Shape {
Circle(int i) {
super(i);
System.out.println("Drawing Circle");
}
void dispose() {
System.out.println("Erasing Circle");
super.dispose();
}
}

class Triangle extends Shape {
Triangle(int i) {
super(i);
System.out.println("Drawing Triangle");
}
void dispose() {
System.out.println("Erasing Triangle");
super.dispose();
}
}

class Line extends Shape{
private int start,end;
Line(int start,int end) {
super(start);
this.start = start;
this.end = end;
System.out.println("Drawing Line: " + start + ", " + end);
}
void dispose() {
System.out.println("Erasing ;Line: " + start + ", " + end);
super.dispose();
}
}

public class CADSystem extends Shape {
private Circle c;
private Triangle t;
private Line[] lines = new Line[3];
public CADSystem(int i) {
super(i + 1);
for (int j = 0;j < lines.length;j++)
lines[j] = new Line(j,j*j);
c = new Circle(1);
t = new Triangle(1);
System.out.println("Combined constructor");
}

public void dispose() {
System.out.println("CADSystem.dispose()");
t.dispose();
c.dispose();
for (int i = lines.length - 1;i >= 0;i--)
lines[i].dispose();
super.dispose();
}

public static void main(String[] args) {
CADSystem x = new CADSystem(47);
try{

}
finally {
x.dispose();
}

}

}


The finally clause is saying,”Always call dispose() for x,no matter what happens.”

In general,you should follow the same form that is imposed by a C++ complier on its destructors:First perform all of the cleanup work specific to your class,in the reverse order of creation.

result:

Drawing Line: 0, 0
Shape constructor
Drawing Line: 1, 1
Shape constructor
Drawing Line: 2, 4
Shape constructor
Drawing Circle
Shape constructor
Drawing Triangle
Combined constructor
CADSystem.dispose()
Erasing Triangle
Shape dispose
Erasing Circle
Shape dispose
Erasing ;Line: 2, 4
Shape dispose
Erasing ;Line: 1, 1
Shape dispose
Erasing ;Line: 0, 0
Shape dispose
Shape dispose
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: