2011-04-27 4 views
3

클래스의 속성 값을 설정하고 final을 사용하면 속성을 클래스 생성자의 매개 변수로 초기화해야합니까? 예를 들어, I는 초기화 인라인 또는 생성자 여야 60 개생성자에서 초기화 된 클래스의 속성을 사용합니다.

public class Runs { 
    Teams team; 
    final int racklength=60; 
    int xposteam; 

    public Runs (Teams y) { 
     team=y;   
    } 
} 
+0

당신은 들여 쓰기로 코드를 포맷 할 수 있습니다 코드 블록을 4 칸 띄우기 (또는 코드 섹션을 선택하고 편집기에서 {} 버튼을 클릭). 나는 당신을 위해 그것을했지만 질문을 편집하고 서식을 조금 더 수정하려고 할 수 있습니다. –

답변

1

당신은 항상 final 속성을 초기화해야합니다,하지만 당신은 그것을 할 수 있습니다 (당신이 먼저 선언 할 경우) 장소-또는 생성자 (또는 생성자)에 :

public class Runs { 
    Teams team; 
    final int racklength; // initialization postponed 
    int xposteam; 

    // constructor defaulting racklength to 60 
    public Runs (Teams y){ 
     team=y; 
     racklength=60; 
    } 

    // constructor with variable initialization of final attribute 
    public Runs (int l, Teams y){ 
     team=y; 
     racklength=l; 
    } 

    // error since racklength is not initialized during construction 
    public Runs(){ 
     team=null 
    } 
} 
3

final 필드의 값을 길이의 속성 랙을 가지고 설정.

예 :

class Foo { 
    final String bar = "bar"; 
    Foo() { 
    } 
} 

또는

class Foo { 
    final String bar; 
    Foo() { 
     bar = "bar"; 
    } 
} 

허용한다.

1

아니요, 변수를 선언 한 위치에서 초기화 할 수 있습니다. 그리고 변수에 생성자에 매개 변수를 할당 할 필요가 없습니다.

+0

* "변수를 생성자에 매개 변수로 지정해야하는 이유가 없습니다."* - 내가 잘못 읽은 것일 수도 있지만 ... 어? 인스턴스 레벨 상수 (실제로 정적이 아닌 final 인 경우)를 정의하면 생성자 매개 변수를 통해 인스턴스 레벨 상수를 초기화 할 수 있습니다. 그렇지 않으면 클래스의 모든 인스턴스가 인스턴스 수준 상수에 대해 동일한 값을 가질 경우 상수를 정적으로 만들 수 있습니다. –

+1

동의합니다. 너의 요점은 내가 말한 것과 상호 배타적이지 않다. –

1

아니요, 그렇게 할 필요가 없습니다.

두 가지 모두 정상적으로 작동합니다. 그런 식으로 개체를 건설하고 발신자가 의도 한 값으로 개체의 상태를 만드는 방법을 알고 있기 때문에

public final class SomeClazz { 
    private final int test=10; 
    public SomeClazz(){ 

    } 
    public int getTest() { 
     return test; 
    } 

} 

또는

public final class SomeClazz { 
    private final int test; 
    public SomeClazz(int test){ 
     this.test = test; 
    } 
    public int getTest() { 
     return test; 
    } 

} 

그러나

, 내가 생성자를 통해이를 초기화하는 것을 선호 . 상수 값이어야한다면 Enums을 사용해야합니다. 이런 식으로 클래스에 정의하는 것이 좋습니다.

+0

이렇게하려면 게터가 필요하지 않습니다. – Jeremy

+0

@ 제레미 헤일러 - 맞아. 나는 테스트를'private private '로 선언 할 의도가 아니었다. 내 게시물을 업데이트했습니다. – CoolBeans

+0

당신은 완전히 내 요점을 놓쳤습니다. 클래스/인스턴스 변수를 최종적으로 만들기 위해 getter를 선언 할 필요가 절대적으로 필요합니다. – Jeremy

관련 문제