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:
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:
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
相关文章推荐
- [Thinking in Java]之Initialization & Cleanup(一)
- thinking in java 学习笔记之Initialization and Cleanup
- 看了thinking in java 的initialize and cleanup 的一点总结
- thinking in java(III)--initialization and cleanup
- Thinking in Java(8)-inheritance and cleanup
- 处理教材:Initialization &amp; Cleanup of &quot;Thinking in Java&quot;
- Initialization & Cleanup(Thinking in Java)
- Think In Java 笔记1 initialization & Cleanup
- Thinking in Java 20
- 我的Thinking in Java学习笔记(2)
- Thinking in java 中文版 程序源代码
- Thinking in Java学习笔记(2)(zt)
- Thinking in Java学习扎记(六)
- Thinking in Java 18
- 我的Thinking in Java学习笔记(四) (zt)
- How to Keep Up With Java
- 我的Thinking in Java学习笔记(四)
- 我的Thinking in Java学习笔记(六)
- Thinking in Java 13
- Thinking in Java 15