在一行上定义变量并在下一行创建它的实例有什么好处

问题描述 投票:0回答:3

例如,考虑从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();
}

在那里我们可以看到变量anim在一行上定义,变量的实例在下一行创建。有时我也会在一些开源项目中看到这种方法。

使用这种方法有什么好处,或者仅仅是风格或可读性问题?或者,在幻灯片的情况下,是否适合幻灯片的宽度?但如果是这样的话,他们就可以写下这样的东西:

SpringAnimation anim = new SpringAnimation(
        child, DynamicAnimation.ROTATION);
java android instance instantiation
3个回答
3
投票

我们做一个小实验。给出以下两个类:

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);
  }
}

我们可以看一下生成的字节码:

> 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
}

由于生成的字节码是相同的,这是您喜欢的问题。


0
投票

这只是开发人员遵循的代码指南。与在Android工作室中一样(请参阅屏幕截图),屏幕右侧有一条细垂直线,在这种情况下,我们的代码长度不应超出该行,这就是为什么如果超过我们在下一行写的话。

截图中,我已经在下一行实现了OnNavigationItemSelectedListener。虽然它不是强制性的,但最佳做法是遵循。

您可以从以下链接中参考代码指南:

https://blog.mindorks.com/android-code-style-and-guidelines-d5f80453d5c7

codeline


0
投票

虽然每个人都对可读性和良好的编码标准有一个很好的观点,但所提供的示例表明,有些对象具有强制和可选字段。

上面的代码可以很容易地放在同一个“行”中,如下所示:

Obj o = new Obj([mandatory args])
  .optionalParam1(...)
  .optionalParam2(...);

但决定将强制性与可选性分开,因此其更具可读性和组织性(或者至少就是我的想法)。

他们已经证明这并不重要,因为代码在最后是相同的,所以我们由你来决定哪些实践适合你,哪些不适合(我喜欢大量评论我的代码所以更容易回来,但我只是在我的个人项目中这样做,因为如果代码干净且不言自明,我的工作团队并没有发现它有价值。

来自@ Turing85和@Kavita_p的答案都很好,它们为您提供了足够的背景和信息!

© www.soinside.com 2019 - 2024. All rights reserved.