# HG changeset patch # User Jaroslav Tulach # Date 1224099575 -7200 # Node ID 6befc59fc53c52625df9d059dd192441b9591bf1 # Parent e619b35c903eb7ac620490dd8bf5da1422d164da Renaming the class and adding code snippet boundaries diff -r e619b35c903e -r 6befc59fc53c samples/gc/test/org/apidesign/gc/CompilerSurprisesTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/gc/test/org/apidesign/gc/CompilerSurprisesTest.java Wed Oct 15 21:39:35 2008 +0200 @@ -0,0 +1,75 @@ +package org.apidesign.gc; + +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import org.junit.Test; +import org.netbeans.junit.NbTestCase; +import static org.junit.Assert.*; + +// BEGIN: compiler.surprises.intro +public class CompilerSurprisesTest { + Reference cache; + + public String factory() { + String value = new String("Can I disappear?"); + cache = new WeakReference(value); + return value; + } + + @Test + public void checkThatTheValueCanDisapper() { + String retValue = factory(); + retValue = null; + assertGC("Nobody holds the string value anymore. It can be GCed.", cache); + } +// FINISH: compiler.surprises.intro + +// BEGIN: compiler.surprises.error + @Test + public void obviouslyWithoutClearingTheReferenceItCannotBeGCed() { + String retValue = factory(); +// commented out: retValue = null; + assertNotGC("The reference is still on stack. It cannot be GCed.", cache); + } +// END: compiler.surprises.error + + +// BEGIN: compiler.surprises.surprise + boolean yes = true; + @Test + public void canItBeGCedSurprisingly() { + String retValue; + if (yes) { + retValue = factory(); + } + assertGC("Can be GCed, as retValue is not on stack!!!!", cache); + } +// END: compiler.surprises.surprise + + +// BEGIN: compiler.surprises.fix + boolean ok = true; + @Test + public void canItBeGCedIfInitialized() { + String retValue = null; + if (ok) { + retValue = factory(); + } + assertNotGC("Cannot be GCed as retValue is not stack", cache); + } +// END: compiler.surprises.fix + + private static void assertGC(String msg, Reference ref) { + NbTestCase.assertGC(msg, ref); + } + + private static void assertNotGC(String msg, Reference ref) { + try { + NbTestCase.assertGC("Cannot be GCed. " + msg, ref); + } catch (Error ex) { + // OK + return; + } + fail(msg + ref.get()); + } +} \ No newline at end of file