在一行上定义变量并在下一行创建它的实例有什么好处
What are the benefits of defining a variable on one line and create an instance of it on the next line
例如,考虑来自 Google I/O '17 "Android Animations Spring to Life":
的幻灯片
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);
我们来做个小实验。给定以下两个 类:
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
}
由于生成的字节码是相同的,这是个人喜好问题。
虽然每个人都对可读性和良好的编码标准有很好的看法,但提供的示例表明有些对象具有必填字段和可选字段。
上面的代码可以很容易地放在同一个 "line" 中,如下所示:
Obj o = new Obj([mandatory args])
.optionalParam1(...)
.optionalParam2(...);
但决定将强制性与可选性分开,因此它更具可读性和组织性(或者至少我是这么认为的)。
他们已经证明这无关紧要,因为最后的代码是相同的,所以由您来决定哪些做法适合您,哪些不适合(我喜欢对我的评论进行大量评论代码更容易回来,但我只在我的个人项目中这样做,因为如果代码干净且不言自明,我的工作团队不会发现它有价值。
@Turing85 和@Kavita_p 的答案都很好,它们为您提供了足够的上下文和信息!
例如,考虑来自 Google I/O '17 "Android Animations Spring to Life":
的幻灯片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);
我们来做个小实验。给定以下两个 类:
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
}
由于生成的字节码是相同的,这是个人喜好问题。
虽然每个人都对可读性和良好的编码标准有很好的看法,但提供的示例表明有些对象具有必填字段和可选字段。
上面的代码可以很容易地放在同一个 "line" 中,如下所示:
Obj o = new Obj([mandatory args])
.optionalParam1(...)
.optionalParam2(...);
但决定将强制性与可选性分开,因此它更具可读性和组织性(或者至少我是这么认为的)。
他们已经证明这无关紧要,因为最后的代码是相同的,所以由您来决定哪些做法适合您,哪些不适合(我喜欢对我的评论进行大量评论代码更容易回来,但我只在我的个人项目中这样做,因为如果代码干净且不言自明,我的工作团队不会发现它有价值。
@Turing85 和@Kavita_p 的答案都很好,它们为您提供了足够的上下文和信息!