2010-01-13 7 views
11

인스턴스 변수를 final로 갖는 점은 무엇입니까?최종 변수로 인스턴스 변수가 있습니까?

변수를 정적 최종 변수로 설정하는 것이 낫지 않습니까?

개체에 의해 변경 될 수없는 경우 클래스 (정적) 변수와 동일합니까?

+0

http://renaud.waldura.com/doc/java/final-keyword.shtml –

답변

20

아니. static은 클래스의 모든 인스턴스에서 동일하다는 것을 의미합니다. final은 초기 할당 후에 할당 할 수 없음을 의미합니다. 따라서 두 개의 인스턴스는 비 정적 최종 변수에 대해 다른 값을 가질 수 있습니다.

변수를 final로 설정하는 데는 여러 가지 이유가 있습니다. 최고 중 하나는 선명도입니다. 방법을 읽고 foo가 최종적인 것이라는 사실을 알게되면 아래에서 변경되는 부분에 대해 걱정할 필요가 없습니다. 그것은 할 수 없다. 덜 변수가있는 최종 변수를 사용하여 코드를 더 많이 변경할 수 있습니다 ("막대 앞이나 뒤의 foo 값을 변경 했습니까? 중요합니까?"). 일부 변수는 변경 될 수 없다는 것을 알고 있기 때문에 더 많은 변경을 할 수 있습니다. 또한 인 변수에 내 관심을 집중시킵니다. 더 관심을 가질만한 요소입니다.

+1

하지만 클래스를 작성할 때 마지막 인스턴스 변수에 값을 지정하지 않으시겠습니까? 그러면 모든 객체가 해당 값을 사용하고 변경할 수 없음을 의미합니다. 또는 나는 틀린가? – ajsie

+5

반드시 그렇지는 않습니다 - 생성자에 할당 될 수 있습니다. – danben

1

그것은 그들이 어쨌든일을해서는 안되는 바보 같은 일을에서 다른 프로그래머를 방지 ...

2

정적 클래스 변수로는 할 수없는 개체 인스턴스에 특정한 값을 할당 할 수 있습니다.

+0

그래서 내가 마지막으로 선언 한 클래스를 작성한다는 것을 의미합니다. 그리고 내가 클래스를 인스턴스화하고 메소드를 호출했을 때 메소드는 변경할 수없는 값을 할당 할 것인가? – ajsie

+0

난 당신이 생성자에서 값을 할당해야한다고 생각, 그렇지 않으면 컴파일러 오류가 발생합니다. –

3

두 가지 이유 : - 그래서 "immutable object"라고

1) 클래스 디자인보기에서, 그것은 프로그래머가 필드 인스턴스 이후 변경되지는 사실에 의존 할 수 있습니다. Java 자습서의 내용 :

변경 불가능한 객체는 동시 응용 프로그램에서 특히 유용합니다. 상태를 변경할 수 없으므로 스레드 간섭으로 인해 손상되거나 일관성없는 상태에서 관찰 될 수 없습니다.

변경 불가능한 개체는 다양한 프로그래밍 스타일의 초석입니다. 순수 함수 프로그래밍.

2) 두 번째 이유는 JVM 최적화입니다. 모든 필드가 final 인 경우, JVM는 객체의 상태를 변경할 수 없다는 것을 알기 때문에 많은 최적화를 할 수 있습니다. 틀린 실 안전 점검 등.

private final int num = 3; 
더 잘 쓸 수

: 가변되는 객체

private static final int NUM = 3; 

그러나, 종종있을 것이다 참조 및

+1

@Ondra - JVM *이'final' 필드를 최적화 할 수도 있을지도 모르는 것이 측면 문제입니다. 'final'을 사용하는 주된 동기는 코드를보다 강력하게 만드는 것입니다. (그리고 JIT 컴파일러가 그렇지 않은 경우 JIT 컴파일러가 더 나은 작업을 할 수 있기 때문에 Java를 최적화하는 것은 좋지 않다는 조언을 기억하십시오.) –

+0

@Stephen : 1) 필자는 final의 "견고한"측면을 다루었습니다. 두 번째 단락. 2) 작은 데이터 개체를 불변으로 만드는 것은 확실히 미세 최적화가 아니며 상당한 성능 향상을 제공 할 수 있습니다. "클래스를 불변으로 만들지 않는 가장 일반적인 이유 중 하나는 퍼블리싱이 퍼포먼스를 손상 시킨다는 믿음이다. 때로는 사실이지만 종종 불변 인 객체를 사용하는 것이 중요하다. 놀라운 성능 이점을 제공합니다. " –

4

난 당신 같은 간단한 사건에 대해 생각하는 것 같아요 따라서 클래스간에 공유 할 수 없습니다.

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)에 할당 될 수 있고,뿐만 아니라 일부로서 선언.

+0

마지막 예제는'final' 클래스를 보여줍니다. 그것은 가변성과는 아무런 관련이 없으며 초보 독자 만 혼란스럽게 할 것입니다. –

관련 문제