adding default method changes interface initialization order?
    Stuart Marks 
    stuart.marks at oracle.com
       
    Tue Apr 22 20:24:20 UTC 2014
    
    
  
Hi all,
It seems like the presence of a default method in an interface will change the 
timing of when that interface is initialized.
Interface initialization is covered by JLS 12.4.1 [1]. Example 12.4.1-3 
illustrates this:
     interface I {
         int i = 1, ii = Test.out("ii", 2);
     }
     interface J extends I {
         int j = Test.out("j", 3), jj = Test.out("jj", 4);
     }
     interface K extends J {
         int k = Test.out("k", 5);
     }
     class Test {
         public static void main(String[] args) {
             System.out.println(J.i);
             System.out.println(K.j);
         }
         static int out(String s, int i) {
             System.out.println(s + "=" + i);
             return i;
         }
     }
The expected output is:
     1
     j=3
     jj=4
     3
Indeed, I get the expected output for the example as it stands. However, if a 
default method is added to interface I, the behavior of the program changes. 
Consider:
     interface I {
         int i = 1, ii = Test.out("ii", 2);
         default void method() { } // causes initialization!
     }
The output changes to:
     1
     ii=2
     j=3
     jj=4
     3
That is, the "ii=2" line indicates that interface I has now been initialized 
where it hadn't been before. The mere presence of a default method seems to 
trigger the change, even if the default method is never called, referenced, or 
overridden.
Is this a bug?
(Hat tip to Sotirios Delimanolis for asking this on StackOverflow. [2])
s'marks
[1] http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.1
[2] 
http://stackoverflow.com/questions/23096084/when-is-an-interface-with-a-default-method-initialized
s'marks
    
    
More information about the compiler-dev
mailing list