1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
<!DOCTYPE html>
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="../logi/reset.css" />
<link rel="stylesheet" type="text/css" href="features.css" />
<link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" />
<meta name="description" content="Spice up your java" />
<title>@Cleanup</title>
</head><body><div id="pepper">
<div class="minimumHeight"></div>
<div class="meat">
<div class="header"><a href="../index.html">Project Lombok</a></div>
<h1>@Cleanup</h1>
<div class="byline">Automatic resource management: Call your <code>close()</code> methods safely with no hassle.</div>
<div class="overview">
<h3>Overview</h3>
<p>
You can use <code>@Cleanup</code> to ensure a given resource is automatically cleaned up before the code execution path exits your
current scope. You do this by annotating any local variable declaration with the <code>@Cleanup</code> annotation like so:<br />
<code>@Cleanup InputStream in = new FileInputStream("some/file");</code><br />
As a result, at the end of the scope you're in, <code>in.close()</code> is called. This call is guaranteed to run by way of a
try/finally construct. Look at the example below to see how this works.
</p><p>
If the type of object you'd like to cleanup does not have a <code>close()</code> method, but some other no-argument method, you can
specify the name of this method like so:<br />
<code>@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);</code><br />
By default, the cleanup method is presumed to be <code>close()</code>. A cleanup method that takes argument cannot be called via
<code>@Cleanup</code>.
</p>
</div>
<div class="snippets">
<div class="pre">
<h3>With Lombok</h3>
<div class="snippet">@HTML_PRE@</div>
</div>
<div class="sep"></div>
<div class="post">
<h3>Vanilla Java</h3>
<div class="snippet">@HTML_POST@</div>
</div>
</div>
<div style="clear: left;"></div>
<div class="overview">
<h3>Small print</h3><div class="smallprint">
<p>
In the finally block, the cleanup method is only called if the given resource is not <code>null</code>. However, if you use <code>delombok</code>
on the code, a call to <code>lombok.Lombok.preventNullAnalysis(Object o)</code> is inserted to prevent warnings if static code analysis could
determine that a null-check would not be needed. Compilation with <code>lombok.jar</code> on the classpath removes that method call,
so there is no runtime dependency.
</p>
<p>
If your code throws an exception, and the cleanup method call that is then triggered also throws an exception, then the original exception
is hidden by the exception thrown by the cleanup call. You should <em>not</em> rely on this 'feature'. Preferably, lombok would like to generate
code so that, if the main body has thrown an exception, any exception thrown by the close call is silently swallowed (but if the main body
exited in any other way, exceptions by the close call will not be swallowed). The authors of lombok do not currently know of a feasible way
to implement this scheme, but if java updates allow it, or we find a way, we'll fix it.
</p><p>
You do still need to handle any exception that the cleanup method can generate!
</p>
</div>
</div>
<div class="footer">
<a href="index.html">Back to features</a> | <a href="Data.html">Previous feature (@Data)</a> | <a href="Synchronized.html">Next feature (@Synchronized)</a><br />
<a href="../credits.html" class="creditsLink">credits</a> | <span class="copyright">Copyright © 2009-2011 Reinier Zwitserloot and Roel Spilker, licensed under the <a href="http://www.opensource.org/licenses/mit-license.php">MIT license</a>.</span>
</div>
<div style="clear: both;"></div>
</div>
</div>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-9884254-1");
pageTracker._trackPageview();
} catch(err) {}
</script>
</body></html>
|