Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!news.albasani.net!.POSTED!not-for-mail From: Lew Newsgroups: comp.lang.java.programmer Subject: Re: Enums: Properties vs. Methods Date: Thu, 31 Mar 2011 08:52:58 -0400 Organization: albasani.net Lines: 59 Message-ID: References: <2f38bb8e-9a8d-4464-ad3d-b9ce0b557219@e21g2000yqe.googlegroups.com> <44ad2578-4baf-4fa9-81b6-3aaa6f458dc7@s11g2000yqh.googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Trace: news.albasani.net OJdzHGzltuaXxbijpLoTgxdpBU1B0gXn8ZBseHtqAUVHDaORvnLYDDNBWrxVbQH6MI7C8fY98grGHfrrsgFRyA== NNTP-Posting-Date: Thu, 31 Mar 2011 12:52:48 +0000 (UTC) Injection-Info: news.albasani.net; logging-data="XrMUK2jTHLjX0RvvXiHMtp30HYWwusidLS4GFk9ZIsL9/bKe+IQ84zSyCPIDJEIwH9cESO5ZDW+GFOg2nUnG9FCrSPZ141OFeTwFwVCMKDGPcyulig8JssH1EuG58ITV"; mail-complaints-to="abuse@albasani.net" User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.14) Gecko/20110223 Thunderbird/3.1.8 In-Reply-To: <44ad2578-4baf-4fa9-81b6-3aaa6f458dc7@s11g2000yqh.googlegroups.com> Cancel-Lock: sha1:Jc1QMQB8YnNxg31Q3dlGoywwPiM= Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:2651 Robert Klemme wrote: > You left out an important part of the sentence: > > "If a final field is initialized to a compile-time constant IN THE > FIELD DECLARATION, [...] uses of that final field are replaced at > compile time with the compile-time constant." (uppercase by me) > http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.5.3 > > This is not applicable in the "properties" case because final fields > are NOT initialized in the field declaration: > > public enum Prop { > > A(true, true), B(true, false), C(false, true); > > private final boolean a; > > private final boolean b; > > Prop(boolean a, boolean b) { > this.a = a; > this.b = b; > } > > // ... > } Excellent point. And yet: 37: tableswitch { // 3 to 3 3: 67 default: 56 '3' is how it expanded 'kount' in the 'switch' in my example (where 'kount' is final and set to 3). and public void run(); Code: 0: aload_0 1: getfield #21 // Field randy:Ljava/util/Random; 4: iconst_4 5: invokevirtual #30 // Method java/util/Random.nextInt:(I)I 8: istore_1 for public void run() { int value = randy.nextInt( kount + 1 ); Note that the compiler DOES replace the reference with a constant. Looks like I was right after all. -- Lew Honi soit qui mal y pense. http://upload.wikimedia.org/wikipedia/commons/c/cf/Friz.jpg