<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Here is another helper that can enforce a subset of immutable for aspectj projects.<div>It gets the compiler to check that any class marked with the Immutable annotation doesn't (effectively) contain&nbsp;any&nbsp;non&nbsp;final&nbsp;fields.</div><div>The aspect/annotation should probably be changed to something like "JustFinals" since I now realize the definition of immutable isn't quite so</div><div>straightforward:</div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; "><font class="Apple-style-span" color="#7F0055"><br></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; "><span style="color: rgb(127, 0, 85); ">public</span>&nbsp;aspect ImmutablePolicy {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(42, 0, 255); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">        </span>declare error : set(!</span><span style="color: rgb(127, 0, 85); ">static</span><span style="color: rgb(0, 0, 0); ">&nbsp;!</span><span style="color: rgb(127, 0, 85); ">final</span><span style="color: rgb(0, 0, 0); ">&nbsp;* (</span><span style="color: rgb(100, 100, 100); ">@</span><span style="color: rgb(0, 0, 0); ">Immutable *).*) :&nbsp;</span>"immutable classes can't assign to non final fields"<span style="color: rgb(0, 0, 0); ">;</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; min-height: 15px; "><span class="Apple-tab-span" style="white-space: pre; ">        </span><br class="webkit-block-placeholder"></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span><span style="color: rgb(100, 100, 100); ">@</span>Target(ElementType.TYPE)</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span><span style="color: rgb(100, 100, 100); ">@</span>Retention(RetentionPolicy.RUNTIME)</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span><span style="color: rgb(100, 100, 100); ">@</span>ThreadSafe</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(127, 0, 85); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">        </span></span>public<span style="color: rgb(0, 0, 0); ">&nbsp;</span>static<span style="color: rgb(0, 0, 0); ">&nbsp;</span>@interface<span style="color: rgb(0, 0, 0); ">&nbsp;Immutable {</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>}</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; ">}</div><div><font class="Apple-style-span" face="Monaco" size="3"><span class="Apple-style-span" style="font-size: 11px;"><br></span></font></div></div><div>However there must be a great deal of boilerplate code and design pattern enforcement that aspectj can help with. The most obvious</div><div>one&nbsp;that springs to mind is some around advice that surrounds a method with a reentrant lock that makes sure it is released correctly.</div><div>In fact if I recall correctly, one of the objections in the jcip book for not abandoning intrinsic locks was that it is easy to forget to release</div><div>reentrant locks.</div><div><br></div></body></html>