2012-04-10 8 views
4

우선이 내용은 Initialize final variable before constructor in Java과 정확히 일치하지 않습니다. 그것은 아마 관련이 있지만 나를 만족시키는 어떤 대답도 없습니다.최종 변수 할당 : 선언 또는 생성자에서?

제 문제는 스윙 GUI의 최종 변수에 관한 것입니다. 특히 사용자 정의 Action에 관한 것입니다. 숫자가 final이고 숫자가 static final입니다.

질문 : 변수가 실제로 상수이면 무엇이 더 나은가? 구성시이를 초기화하거나 선언시 초기화할까요?

위에서 언급 한 질문에 대한 대답은 일반적으로 변수를 선언 할 때 할당 할 수있게되면 변수 static을 만드는 것을 가리 킵니다. 변수가 정적 컨텍스트에서 사용되지 않기 때문에 실제로는 나에게 이해가되지 않습니다. 내 양식이 아이콘처럼 사용하는 이미지가 두 개 있습니다. 응용 프로그램이 이미지를 수정하지 않는 한 Image가 정적 인 것이기 때문에 이미지를 정적으로 만들었습니다. 그건 의미가 있습니다.

한편, Action은 사용자 지정 내부 클래스의 새 인스턴스입니다. 매우 기술적으로 그들은 정적이지만, 단지 다른 느낌입니다. 단순히 은 (는)을 정적 컨텍스트에서 사용할 수 없습니다. 그래서 내가 넣을 :

private final CustomAction customAction = new CustomAction(); 

또는 나는 그것을 생성자에서 초기화합니까? 어떤게 더 좋아? 아니면 static에 대해 잘못된 생각을하고 있습니까?

+0

앞서 귀하의 연구를 수행 할 때 +1 –

+1

코드에서 값을 알면 선언에서 초기화하십시오. 건축 중이 아니 네요. – titogeo

답변

5

필드가 상수 인 경우, 클래스의 static final 회원 수 있도록, 그렇지 않으면

public class Foo{ 
    public static final int BAR = ...; 
} 

, 생성자의 필드를 초기화합니다.

+1

당신은 그 말을하는 _n_ 번째 인물입니다. 아무도 왜 그 이유를 정확히 말하지 않았지만이 접근법을 정당화했습니다. – MarioDS

+1

@MarioDeSchaepmeester, [this] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html)를 참조하십시오. – mre

+4

@MarioDeSchaepmeester 상수 인 경우 왜 생성자를 호출 할 때마다 다시 초기화해야합니까? _plenty_의 칭의가 있습니다. 링크가 게시되면 좋은 시작입니다. – darrengorman

1

선언시 상수 변수를 초기화하십시오. 더 읽기 쉽습니다. 인스턴스의 레벨이 아닌 클래스 레벨 변수 인 경우 클래스의 다른 인스턴스에 대해 다른 값을 입력하는 것이 의미가 없으면 정적으로 만듭니다.

0

빠른 응용 프로그램 시작 및 프로그램 부분의 경우 사용자가 대화 (정보 대화 상자)를 방문하지 않을 수 있으므로 정적은 좋지 않습니다. 일반적으로 정적은 당신이 발견 한 것처럼별로 좋아하지 않습니다. 몇 가지 이유가 있지만 매우 설득력있는 것은 없습니다. 그러나 때때로 그것은 반 패턴 또는 그것의 표시입니다.

여전히 귀하의 경우에는 정적 이미지를 자제합니다. 그런데 리소스가 내부적으로 캐시됩니다.

+1

이것은 상당히 혼란 스럽습니다 ... 응용 프로그램의 런타임 동안 일정하게 유지되는 이미지 집합이 필요하면 (예 : 응용 프로그램에 몇 번 표시되지만 해당 단추에 같은 아이콘이 모두 포함 된 경우), 정적으로로드하지 않는 이유는 무엇입니까? – CodeBlind

+0

즉시 표시되는 툴바, 예. 물론 정적인지 또는 툴바를 만들 때 아무런 차이가 없습니다. –

1

나는 당신이 올바른 방법을 사용하지 않고 정적으로 만들지 않는다고 생각합니다. CustomAction 객체가 생성자에서 생성되는 GUI의 인스턴스에 맞게 사용자 정의 된 것처럼 들리기 때문입니다. 난 당신이 생성자에서 초기화 여부 또는 생성자가 CustomAction 다르게 생성자의 입력 인수를 기반으로 초기화 할 수 있는지 여부에 따라 달라집니다 생각합니다.

여기에 non-static은 변수가 특정 개체 유형의 모든 인스턴스에서 일정하게 유지되는 경우 static이어야합니다. 이 은 프로그램의 런타임에 대해 메모리를 저장하며 각 객체 인스턴스가 생성 될 때 은 CPU 시간을 저장합니다. 이는 객체의 새 인스턴스를 만들 때마다 상수를 초기화 할 필요가 없기 때문입니다.반면에, 변수가 특정 객체 인스턴스에 대해 일정하게 유지되지만 인스턴스마다 다른 경우 변수는 정적이어서는 안됩니다.

마지막으로 (의도적 인 말장난) final은 원시 값이나 Object에 대한 참조가 변경되기를 원하지 않을 때마다 사용해야합니다. 정적 또는 비 정적 컨텍스트는 변수가 final이어야하는지 여부에 영향을주지 않습니다. 개발자가 해당 변수를 변경하고 싶지 않으므로 정확히 final입니다. 정적 컨텍스트는 개발자가 액세스하려는 방법에만 전적으로 달려 있습니다.