변수 재 할당 중지
이 답변은 지적으로 흥미롭지 만 간단한 대답은 읽지 못했습니다.
컴파일러에서 변수가 다른 객체에 다시 할당되지 않도록하려면 final 키워드를 사용하십시오 .
변수가 정적 변수, 멤버 변수, 로컬 변수 또는 인수 / 매개 변수인지에 관계없이 효과는 완전히 동일합니다.
예
실제로 효과를 보자.
두 개의 변수 ( arg 및 x )에 서로 다른 객체를 재 할당 할 수 있는이 간단한 방법을 고려하십시오 .
// Example use of this method:
// this.doSomething( "tiger" );
void doSomething( String arg ) {
String x = arg; // Both variables now point to the same String object.
x = "elephant"; // This variable now points to a different String object.
arg = "giraffe"; // Ditto. Now neither variable points to the original passed String.
}
지역 변수를 final 로 표시하십시오 . 컴파일러 오류가 발생합니다.
void doSomething( String arg ) {
final String x = arg; // Mark variable as 'final'.
x = "elephant"; // Compiler error: The final local variable x cannot be assigned.
arg = "giraffe";
}
대신 매개 변수를 final 로 표시해 봅시다 . 컴파일러 오류가 발생합니다.
void doSomething( final String arg ) { // Mark argument as 'final'.
String x = arg;
x = "elephant";
arg = "giraffe"; // Compiler error: The passed argument variable arg cannot be re-assigned to another object.
}
이야기의 교훈:
변수가 항상 같은 객체를 가리 키도록하려면 변수를 final로 표시하십시오 .
인수를 다시 할당하지 마십시오
좋은 프로그래밍 방법 (모든 언어로)으로, 호출 메소드가 전달한 오브젝트 이외의 오브젝트에 매개 변수 / 인수 변수를 다시 지정 해서는 안됩니다 . 위의 예에서 절대로 줄을 쓰지 않아야합니다 arg =
. 인간은 실수를 저지르고 프로그래머는 인간이므로 컴파일러에게 도움을 요청하십시오. 컴파일러가 이러한 재 할당을 찾아 플래그를 지정할 수 있도록 모든 매개 변수 / 인수 변수를 'final'로 표시하십시오.
회고
다른 답변에서 언급했듯이 ... 프로그래머가 배열의 끝을지나 읽는 것과 같은 멍청한 실수를 피하도록 돕는 Java의 원래 설계 목표를 감안할 때 Java는 모든 매개 변수 / 인수 변수를 '최종'으로 자동 시행하도록 설계되어야합니다. 즉, 인수는 변수가 아니어야합니다 . 그러나 뒤늦은 시각은 20/20 비전이며 Java 디자이너는 당시 손을 가득 채웠습니다.
따라서 항상 final
모든 인수에 추가 합니까?
final
선언되는 각각의 모든 메소드 매개 변수에 추가해야합니까 ?
- 이론적으로는 그렇습니다.
- 실제로는 아닙니다. method 메소드의 코드가 길거나 복잡한 경우에만
추가하십시오 final
. 인수는 로컬 또는 멤버 변수로 오인되어 재 할당 될 수 있습니다.
인수를 다시 할당하지 않는 관행을 사면 각각에 인수를 추가하는 경향이 있습니다 final
. 그러나 이것은 지루하며 선언을 조금 더 읽기 어렵게 만듭니다.
인수가 지역 변수 또는 멤버 변수가 아닌 인수 인 짧은 간단한 코드의 경우에는을 추가하지 않아도 final
됩니다. 코드가 분명하고 나나 다른 프로그래머가 실수로 인수 변수를 인수가 아닌 다른 인수로 잘못 리팩토링하거나 리팩토링 할 가능성이 없다면 귀찮게하지 마십시오. 내 자신의 작업에서 final
인수가 로컬 또는 멤버 변수로 착각 할 수있는 더 길거나 관련된 코드 만 추가 합니다.
완전성을 위해 추가 된 또 다른 사례
public class MyClass {
private int x;
//getters and setters
}
void doSomething( final MyClass arg ) { // Mark argument as 'final'.
arg = new MyClass(); // Compiler error: The passed argument variable arg cannot be re-assigned to another object.
arg.setX(20); // allowed
// We can re-assign properties of argument which is marked as final
}