Search code examples
javaandroidinstanceinstantiation

What are the benefits of defining a variable on one line and create an instance of it on the next line


For example consider the slide from the Google I/O '17 "Android Animations Spring to Life":

enter image description here

SpringForce force = new SpringForce(0)
        .setDampingRation(0.4f)
        .setStiffness(500f);
for (int i = 0; i < heads.getChildCount(); i++) {
    View child = heads.getChildAt(i);
    SpringAnimation anim;
    anim = new SpringAnimation(child, DynamicAnimation.ROTATION);
    anim.setSpring(force).setStartValue(-25).start();
}

There we can see that variable anim is defined on one line and the instance of the variable is created on the next line. Sometimes I also see that approach in some open source projects.

Is there a real benefit of using that approach or it is just a matter of style or readability? Or, in the case of slides, it is a matter of fitting the width of the slide? But if that's so they could have written something like:

SpringAnimation anim = new SpringAnimation(
        child, DynamicAnimation.ROTATION);

Solution

  • Let's do a little experiment. Given the following two classes:

    public class Test {
      public static void main(String... args) {
        Integer i = Integer.valueOf(1);
        System.out.println(i);
      }
    }
    
    public class Test2 {
      public static void main(String... args) {
        Integer i;
        i = Integer.valueOf(1);
        System.out.println(i);
      }
    }
    

    we can take a look at the generated bytecode:

    > javac *.java && javap -c *.class
    Compiled from "Test.java"
    public class Test {
      public Test();
      Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return
    
      public static void main(java.lang.String...);
      Code:
           0: iconst_1
           1: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
           4: astore_1
           5: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
           8: aload_1
           9: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
          12: return
    }
    Compiled from "Test2.java"
    public class Test2 {
      public Test2();
      Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return
    
      public static void main(java.lang.String...);
      Code:
           0: iconst_1
           1: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
           4: astore_1
           5: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
           8: aload_1
           9: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
          12: return
    }
    

    Since the generated bytecode is identical, it is a matter of personal preference.