我上课了
class A {
private int x;
public void setX(...){...}
public int getX(){return x;}
}
class B {
int y;
public void setY() {
//Accessing x of A, assume I already have object of A
if(a.getX() < 0) {
y = a.getX();
}
}
}
class C {
int y;
public void setY() {
//Accessing x of A, assume I already have object of A
int tmpX = a.getX();
if(tmpX < 0) {
y = tmpX;
}
}
}
Run Code Online (Sandbox Code Playgroud)
哪一个是更好的编码方式?我x of A在B级或C级访问的方式?
sel*_*lig 12
让我们来看看它编写的内容.我编译
class A {
private int x;
public void setX(int x_){x=x_;}
public int getX(){return x;}
}
class B {
int y;
A a;
public void setY() {
//Accessing x of A, assume I already have object of A
if(a.getX() < 0) {
y = a.getX();
}
}
}
class C {
int y;
A a;
public void setY() {
//Accessing x of A, assume I already have object of A
int tmpX = a.getX();
if(tmpX < 0) {
y = tmpX;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并获得B
public void setY();
Code:
0: aload_0
1: getfield #2 // Field a:LA;
4: invokevirtual #3 // Method A.getX:()I
7: ifge 21
10: aload_0
11: aload_0
12: getfield #2 // Field a:LA;
15: invokevirtual #3 // Method A.getX:()I
18: putfield #4 // Field y:I
21: return
}
Run Code Online (Sandbox Code Playgroud)
对于C.
public void setY();
Code:
0: aload_0
1: getfield #2 // Field a:LA;
4: invokevirtual #3 // Method A.getX:()I
7: istore_1
8: iload_1
9: ifge 17
12: aload_0
13: iload_1
14: putfield #4 // Field y:I
17: return
}
Run Code Online (Sandbox Code Playgroud)
因为C只有getX一次它会更加"有效",因为这是最昂贵的东西.但是你真的不会注意到这一点.特别是当HotSpot JVM将"内联"此方法时,调用非常快.
除非这是运行代码的主要部分,否则 优化这一点是没有意义的因为您几乎没有注意到它.
然而,正如其他地方提到有其他原因无法表现为什么C方式是优选的.一个显而易见的问题是getX()两个调用之间的变化结果(存在并发性).