:final
키워드, 지역 변수에 사용 매개 변수 때 , 생성 된 바이트 코드 (.class
파일)로 만들지 않으며 예상대로 런타임 동안 사용하지 않습니다. (컴파일 시간, 그것은하지만, 아래에 확인하는 diference을 만들 수 있습니다.) 이러한 경우에
인해 익명의 내부 클래스에 적용되지 않습니다 때, 그것은 스타일 선택은 단지 의도 문서화에 유용하다 변수의 범위.
아래의 테스트에서 해당 정보를 확인합니다.
1 : 컴파일러가 final
를 사용하여, 그것의 무언가를 할 수있는 경우가 있습니다 차이 :
이 조각에서
봐 :
boolean zZ = true;
while (zZ) {
int xX = 1001; // <------------- xX
int yY = 1002; // <------------- yY
zZ = (xX == yY);
}
두 int
변수 xX
및 yY
. 처음으로 final
으로 선언하고 두 번째로 final
을 모두 삭제했습니다.
모두 final
:
0: iconst_1 // pushes int 1 (true) onto the stack
1: istore_1 // stores the int on top of the stack into var zZ
2: goto 15
5: sipush 1001 // pushes 1001 onto the operand stack
8: istore_2 // stores on xX
9: sipush 1002 // pushes 1002 onto the operand stack
12: istore_3 // stores on yY
13: iconst_0 // pushes 0 (false): does not compare!! <---------
14: istore_1 // stores on zZ
15: iload_1 // loads zZ
16: ifne 5 // goes to 5 if top int (zZ) is not 0
19: return
모두 비 final
: 상기 경우
// 0: to 12: all the same
13: iload_2 // pushes xX onto the stack
14: iload_3 // pushes yY onto the stack
15: if_icmpne 22 // here it compares xX and yY! <------------
18: iconst_1
19: goto 23
22: iconst_0
23: istore_1
24: iload_1
25: ifne 5
28: return
그들이 final
이다 컴파일러 여기 (javap -c
인쇄) 생성 된 바이트 코드는 그들이 동등하지 않으며 결코 그들을 비교하지 않는다는 것을 알고있다 (false
는 바이트 코드에서 생성된다 xX == yY
은이다).
final
을 사용할 때 생성 된 코드에 대해에서 수행 할 수있는 컴파일러는 이며, 바이트 코드 방식으로 결론을 내릴 수 있습니다. (나는 그들이 의미가 있지만, 확실히 final
위해 여기뿐만 아니라 스타일의 선택을 말하는 게 아니에요.)
2 : 컴파일러가 어떤 결론을 내릴 수없는 경우, 현지 바르에 final
를 사용하여 심지어 final
, 컴파일러 C를 사용하여,이 경우
boolean zZ = true;
int aA = 1001;
int bB = 1002;
while (zZ) {
final int xX = aA; // <------- took away the "final" here, didnt matter
final int yY = bB; // <------- took away the "final" here, didnt matter
zZ = (xX == yY);
}
:
이제 다음 코드를 가지고 : 단지 디자인 선택 주석은 xX
과 yY
이 같다면 컴파일러 시간을 알려주지, 그렇지? 이 때문에
, 우리는 볼 수 있습니다 생성 된 바이트 코드 정확히 같은 우리가 또는 final
없이 클래스 을 생성 할 때 (같은 MD5!).
동안은 일반적인 경우, some say 지역 블록에 final
, 을 사용하는 성능상의 이점이 있다는 것을 others disagree에, final
확실히 만 스타일 선택입니다.
3 : 내부의 지역 변수 또는 외부 루프 - 전혀 차이 :
이 조각의 생성 된 바이트 코드 ...
boolean zZ = true;
int aA = 1001, bB = 1002;
while (zZ) {
int xX = aA; // <--- declaration is inside WHILE
int yY = bB;
zZ = (xX == yY);
}
...이 조각에 대해 생성 된 바이트 코드 ...
boolean zZ = true;
int aA = 1001, bB = 1002;
int xX, yY; // <--- declaration is outside WHILE
while (zZ) {
xX = aA;
yY = bB;
zZ = (xX == yY);
}
이 ...
정확히 같은 (만 줄 번호는 물론, 변경)된다.
다른 유형의 객체 (원시 유형 변수 만이 아님)를 사용한 다른 테스트에서도 같은 결과가 나타났습니다.
이 안에 지역 변수를 선언하거나 외부없이 바이트 코드 효과,이 꽤 많이 디자인 선택입니다 루프, 다른 곳에서 사용하지 않을 경우, 다음, 결론을하는 것이 안전합니다.
참고 : 모든 테스트는 Oracle JRE 버전 1.7.0_13에서 수행되었습니다.
아마 다른 곳과 같은 목적으로 사용됩니다 : 변수를 수정하려고하면 컴파일러가 멈 춥니 다. – Cairnarvon
이 변수는 * 매우 * 로컬 변수입니다 (루프 본문에만 해당). 동일한 루프의 아무 곳에서도 참조되지 않습니다. 다른 목적으로 재사용을 허용하지 않음으로써 가독성을 보호합니까? –