1 package org.apidesign.gc;
3 import java.lang.ref.Reference;
4 import java.lang.ref.WeakReference;
6 import org.netbeans.junit.NbTestCase;
7 import static org.junit.Assert.*;
9 // BEGIN: compiler.surprises.intro
10 public class CompilerSurprisesTest {
11 Reference<String> cache;
13 public String factory() {
14 String value = new String("Can I disappear?");
15 cache = new WeakReference<String>(value);
20 public void checkThatTheValueCanDisapper() {
21 String retValue = factory();
23 assertGC("Nobody holds the string value anymore. It can be GCed.", cache);
25 // FINISH: compiler.surprises.intro
27 // BEGIN: compiler.surprises.error
29 public void obviouslyWithoutClearingTheReferenceItCannotBeGCed() {
30 String retValue = factory();
31 // commented out: retValue = null;
32 assertNotGC("The reference is still on stack. It cannot be GCed.", cache);
34 // END: compiler.surprises.error
37 // BEGIN: compiler.surprises.surprise
40 public void canItBeGCedSurprisingly() {
45 assertGC("Can be GCed, as retValue is not on stack!!!!", cache);
47 // END: compiler.surprises.surprise
50 // BEGIN: compiler.surprises.fix
53 public void canItBeGCedIfInitialized() {
54 String retValue = null;
58 assertNotGC("Cannot be GCed as retValue is not stack", cache);
60 // END: compiler.surprises.fix
62 private static void assertGC(String msg, Reference<?> ref) {
63 NbTestCase.assertGC(msg, ref);
66 private static void assertNotGC(String msg, Reference<?> ref) {
68 NbTestCase.assertGC("Cannot be GCed. " + msg, ref);
73 fail(msg + ref.get());