인스턴스 변수를 final로 갖는 점은 무엇입니까?최종 변수로 인스턴스 변수가 있습니까?
변수를 정적 최종 변수로 설정하는 것이 낫지 않습니까?
개체에 의해 변경 될 수없는 경우 클래스 (정적) 변수와 동일합니까?
인스턴스 변수를 final로 갖는 점은 무엇입니까?최종 변수로 인스턴스 변수가 있습니까?
변수를 정적 최종 변수로 설정하는 것이 낫지 않습니까?
개체에 의해 변경 될 수없는 경우 클래스 (정적) 변수와 동일합니까?
아니. static
은 클래스의 모든 인스턴스에서 동일하다는 것을 의미합니다. final
은 초기 할당 후에 할당 할 수 없음을 의미합니다. 따라서 두 개의 인스턴스는 비 정적 최종 변수에 대해 다른 값을 가질 수 있습니다.
변수를 final로 설정하는 데는 여러 가지 이유가 있습니다. 최고 중 하나는 선명도입니다. 방법을 읽고 foo가 최종적인 것이라는 사실을 알게되면 아래에서 변경되는 부분에 대해 걱정할 필요가 없습니다. 그것은 할 수 없다. 덜 변수가있는 최종 변수를 사용하여 코드를 더 많이 변경할 수 있습니다 ("막대 앞이나 뒤의 foo 값을 변경 했습니까? 중요합니까?"). 일부 변수는 변경 될 수 없다는 것을 알고 있기 때문에 더 많은 변경을 할 수 있습니다. 또한 이 인 변수에 내 관심을 집중시킵니다. 더 관심을 가질만한 요소입니다.
그것은 그들이 어쨌든일을해서는 안되는 바보 같은 일을에서 다른 프로그래머를 방지 ...
정적 클래스 변수로는 할 수없는 개체 인스턴스에 특정한 값을 할당 할 수 있습니다.
그래서 내가 마지막으로 선언 한 클래스를 작성한다는 것을 의미합니다. 그리고 내가 클래스를 인스턴스화하고 메소드를 호출했을 때 메소드는 변경할 수없는 값을 할당 할 것인가? – ajsie
난 당신이 생성자에서 값을 할당해야한다고 생각, 그렇지 않으면 컴파일러 오류가 발생합니다. –
두 가지 이유 : - 그래서 "immutable object"라고
1) 클래스 디자인보기에서, 그것은 프로그래머가 필드 인스턴스 이후 변경되지는 사실에 의존 할 수 있습니다. Java 자습서의 내용 :
변경 불가능한 객체는 동시 응용 프로그램에서 특히 유용합니다. 상태를 변경할 수 없으므로 스레드 간섭으로 인해 손상되거나 일관성없는 상태에서 관찰 될 수 없습니다.
변경 불가능한 개체는 다양한 프로그래밍 스타일의 초석입니다. 순수 함수 프로그래밍.
2) 두 번째 이유는 JVM 최적화입니다. 모든 필드가 final 인 경우, JVM는 객체의 상태를 변경할 수 없다는 것을 알기 때문에 많은 최적화를 할 수 있습니다. 틀린 실 안전 점검 등.
private final int num = 3;
더 잘 쓸 수
: 가변되는 객체
private static final int NUM = 3;
그러나, 종종있을 것이다 참조 및
@Ondra - JVM *이'final' 필드를 최적화 할 수도 있을지도 모르는 것이 측면 문제입니다. 'final'을 사용하는 주된 동기는 코드를보다 강력하게 만드는 것입니다. (그리고 JIT 컴파일러가 그렇지 않은 경우 JIT 컴파일러가 더 나은 작업을 할 수 있기 때문에 Java를 최적화하는 것은 좋지 않다는 조언을 기억하십시오.) –
@Stephen : 1) 필자는 final의 "견고한"측면을 다루었습니다. 두 번째 단락. 2) 작은 데이터 개체를 불변으로 만드는 것은 확실히 미세 최적화가 아니며 상당한 성능 향상을 제공 할 수 있습니다. "클래스를 불변으로 만들지 않는 가장 일반적인 이유 중 하나는 퍼블리싱이 퍼포먼스를 손상 시킨다는 믿음이다. 때로는 사실이지만 종종 불변 인 객체를 사용하는 것이 중요하다. 놀라운 성능 이점을 제공합니다. " –
난 당신 같은 간단한 사건에 대해 생각하는 것 같아요 따라서 클래스간에 공유 할 수 없습니다.
private final List<Node> children = new ArrayList<Children>();
또는 값이 또는 생성자 유도 :
public final class MyThing {
private final String name;
public MyThing(String name) {
this.name = name;
}
[...]
}
참고 final
필드 생성자 (또는 인스턴스 initialiser)에 할당 될 수 있고,뿐만 아니라 일부로서 선언.
마지막 예제는'final' 클래스를 보여줍니다. 그것은 가변성과는 아무런 관련이 없으며 초보 독자 만 혼란스럽게 할 것입니다. –
http://renaud.waldura.com/doc/java/final-keyword.shtml –