변수에는 여러 가지 용도가 있습니다 final
. 여기 몇 가지가 있습니다
최종 상수
public static class CircleToolsBetter {
public final static double PI = 3.141;
public double getCircleArea(final double radius) {
return (Math.pow(radius, 2) * PI);
}
}
그런 다음 코드의 다른 부분에 사용하거나 다른 클래스에서 액세스 할 수 있습니다. 그러면 값을 변경하면 하나씩 변경할 필요가 없습니다.
최종 변수
public static String someMethod(final String environmentKey) {
final String key = "env." + environmentKey;
System.out.println("Key is: " + key);
return (System.getProperty(key));
}
}
이 클래스에서는 environmentKey 매개 변수에 접 두부를 추가하는 범위가 지정된 최종 변수를 빌드합니다. 이 경우, final 변수는 실행 범위 내에서만 final이며 메소드의 각 실행마다 다릅니다. 분석법을 입력 할 때마다 최종 내용이 재구성됩니다. 생성 되 자마자 메소드 실행 범위 중에는 변경할 수 없습니다. 이를 통해 메소드 지속 기간 동안 메소드에서 변수를 수정할 수 있습니다. 아래를보십시오 :
public class FinalVariables {
public final static void main(final String[] args) {
System.out.println("Note how the key variable is changed.");
someMethod("JAVA_HOME");
someMethod("ANT_HOME");
}
}
최종 상수
public double equation2Better(final double inputValue) {
final double K = 1.414;
final double X = 45.0;
double result = (((Math.pow(inputValue, 3.0d) * K) + X) * M);
double powInputValue = 0;
if (result > 360) {
powInputValue = X * Math.sin(result);
} else {
inputValue = K * Math.sin(result); // <= Compiler error
}
이것들은 정말 긴 줄의 코드가있을 때 특히 유용하며 컴파일러 오류를 생성하므로 누군가 실수로 변경해서는 안되는 변수를 변경할 때 논리 / 비즈니스 오류가 발생하지 않습니다.
최종 컬렉션
컬렉션에 대해 이야기 할 때와 다른 경우, 컬렉션을 수정할 수없는 것으로 설정해야합니다.
public final static Set VALID_COLORS;
static {
Set temp = new HashSet( );
temp.add(Color.red);
temp.add(Color.orange);
temp.add(Color.yellow);
temp.add(Color.green);
temp.add(Color.blue);
temp.add(Color.decode("#4B0082")); // indigo
temp.add(Color.decode("#8A2BE2")); // violet
VALID_COLORS = Collections.unmodifiableSet(temp);
}
그렇지 않으면 수정할 수없는 것으로 설정하지 않은 경우 :
Set colors = Rainbow.VALID_COLORS;
colors.add(Color.black); // <= logic error but allowed by compiler
최종 수업 및 최종 방법 은 각각 확장하거나 덮어 쓸 수 없습니다.
편집 : 캡슐화와 관련된 최종 클래스 문제를 해결하려면 :
수업을 마무리하는 두 가지 방법이 있습니다. 첫 번째는 클래스 선언에서 final 키워드를 사용하는 것입니다.
public final class SomeClass {
// . . . Class contents
}
클래스를 final로 만드는 두 번째 방법은 모든 생성자를 private으로 선언하는 것입니다.
public class SomeClass {
public final static SOME_INSTANCE = new SomeClass(5);
private SomeClass(final int value) {
}
마지막으로 표시하면이 테스트 클래스를 살펴 보는 것이 실제로 최종적인 것으로 밝혀지면 문제가 해결됩니다. 언뜻보기에 공개적으로 보입니다.
public class Test{
private Test(Class beanClass, Class stopClass, int flags)
throws Exception{
// . . . snip . . .
}
}
불행히도 클래스의 유일한 생성자는 private이므로이 클래스를 확장 할 수 없습니다. Test 클래스의 경우 클래스가 최종적인 이유는 없습니다. Test 클래스는 암시 적 최종 클래스가 어떻게 문제를 일으킬 수 있는지에 대한 좋은 예입니다.
따라서 암시 적으로 클래스를 생성자 전용으로 만들어서 클래스를 마지막으로 만들 때는이를 마지막으로 표시해야합니다.