<div dir="ltr">On Thu, Mar 13, 2014 at 5:21 AM, Peter Levart <span dir="ltr"><<a href="mailto:peter.levart@gmail.com" target="_blank">peter.levart@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="">On 03/13/2014 11:08 AM, Peter Levart wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
I don't see this as any more complex or unsafe as the rules for final fields. But I don't know if it is compatible with JVM rules.<br>
</blockquote>
<br></div>
Does JVM have any rules for final instance fields regarding their definitive assignment at all non-exceptional exit paths of the constructor?<br></blockquote><div><br></div><div>My understanding is that the JVM doesn't care how many times you assign a final field in a constructor, it only cares that you don't try to assign it from within a non-constructor method. See also <a href="http://stackoverflow.com/questions/6881288/is-final-final-at-runtime">this stackoverflow discussion</a>.<br>

<br></div><div>Note also that the JVM spec specifically allows a constructor to assign final fields before invoking super()/this(). So if the proposal we are talking about were implemented, it should probably also allow this. So for example this would be legal:<br>

<br></div><div style="margin-left:40px"><span style="font-family:courier new,monospace">public class SetOfInts extends HashSet<Integer> {<br><br></span></div><div style="margin-left:40px"><span style="font-family:courier new,monospace">    private final int max;<br>

<br></span></div><div style="margin-left:40px"><span style="font-family:courier new,monospace">    public SetOfInts(int max) {<br></span></div><div style="margin-left:40px"><span style="font-family:courier new,monospace">        this.max = max;   // the only thing you can do with 'this' here<br>

</span></div><div style="margin-left:40px"><span style="font-family:courier new,monospace">        final Integer[] array = new Integer[max];<br></span></div><div style="margin-left:40px"><span style="font-family:courier new,monospace">        for (int i = 0; i < max; i++)<br>

</span></div><div style="margin-left:40px"><span style="font-family:courier new,monospace">            array[i] = i;<br></span></div><div style="margin-left:40px"><span style="font-family:courier new,monospace">        super(Arrays.asList(array));<br>

</span></div><div style="margin-left:40px"><span style="font-family:courier new,monospace">    }<br></span></div><div style="margin-left:40px"><span style="font-family:courier new,monospace">}</span><br></div><div><br></div>

<div>-Archie<br></div></div><br>-- <br><div dir="ltr">Archie L. Cobbs<br></div>
</div></div>