2012-10-06 3 views
0

.NET에서 Java로 "변환 중"입니다. 아래의 코드는Java 및 최종 초기화

class MyClass{ 
    private final int intVar; //ok 
    private final Paint paint; //error "Variable paint might not have been initialized" 

    public MyClass(){ 
     intVar = 12; 
     initializePaint(); 
    } 

    private void initializePaint(){ 
     paint = new Paint(); //error "cannot assign a variable to final variable" 
    } 

} 
+0

어떤 오류 메시지를 게시 할 수 있습니까? – Ami

답변

4

당신은 초기화 할 필요가 최종 필드.

생성자가 개체 생성 중에 한 번만 호출되기 때문에 최종 필드의 초기화가 허용됩니다.

initializePaint() 메서드에서 초기화 했으므로이 메서드는 여러 번 호출 될 수 있으며 최종 변수/필드는 상수이며 변경할 수 없기 때문에 컴파일러 오류가 발생합니다. initializePaint() 메서드를 여러 번 호출하면되므로 최종 필드의 초기화가 여러 번 잘못되었습니다. 따라서 컴파일러는 오류를 발생시킵니다.

class MyClass{ 
    private final int intVar; //ok 
    private final Paint paint;// paint = new Paint(); to avoid //error "Variable paint might not have been initialized" 

    public MyClass(){ 
     intVar = 12; 
     //initializePaint(); 
     paint = new Paint(); // here initialized And allowed. 
    } 

    private void initializePaint(){ 
     paint = new Paint(); //error "cannot assign a variable to final variable" 
    } 
} 
0

를 작동하지 않는 이유는 컴파일러가 생성자에 initializePaint() 메서드를 호출 할 것으로보고 있지만,이 방법은 paint 변수를 설정합니다하지 않는 것이 궁금합니다. 클래스의

class MyClass{ 
    private final int intVar; //ok 
    private final Paint paint; //error 

    public MyClass(){ 
     intVar = 12; 
     paint= new Paint(); 
    } 
} 
1

최종 인스턴스 변수는 생성자의 범위에서 인스턴스화해야합니다 당신은 명시 적으로 같은 생성자에서 paint 필드를 설정해야합니다. Paint 개체의 초기화를 생성자로 이동하고 초기화 메서드에서 getter getPainter을 사용합니다.

최종 vars를 사용하는 경우 BTW +1. 좋은 코딩 방법입니다. IMO Java는 변수에 대해 '변경할 수있는'키워드가 있어야하고 final을 final로 사용해야합니다.

+0

그냥 'private final Paint paint = new Paint();'라고 말하는 것이 낫지 않습니까? –

+0

@AlanDert 스타일에 관한 질문입니다. 개인적으로, 정적 초기화가 그만큼 맘에 들지 않습니다. (우리가 광범위하게 사용하는 테스트를 제외하고) – maasg

+0

@maasg 그건 정적 초기화가 아닙니다 ... – yshavit

0

모든 최종 변수의 초기화는 생성자에서 발생해야하며 생성자의 메서드 호출 (예 : initializePaint())의 호출 계층 구조에서 발생하지 않아야합니다.

0

final은 일단 할당되면 다시 할당 할 수 없으므로 생성자에서 할당해야합니다. 일부 읽기 : 그래서 당신은 paint

편집을 재 할당하는 방법을 사용할 수 없습니다 initializePaint() 메소드가 아닌 생성자, 어떤 장소에서 호출 할 수 있기 때문에 http://en.wikipedia.org/wiki/Final_(Java)

+0

"final"은 재 정의가 아닌 재 지정을 피하는 키워드로 정의하는 것이 더 적절하다고 생각합니다. OO 언어를 사용하고 있습니다. – axis

+0

최종 클래스에 대한 재 정의, 그렇긴하지만 "할당"이 변수에 더 적절하다고 생각합니다. –

3

. 그리고 Java 컴파일러는 최종 변수가 생성자에서 한 번만 할당되도록합니다. 따라서 생성자로 할당을 이동해야합니다.

+0

예, 가능합니다. 하지만 제 경우에는 contructructor에서 호출됩니다. –

+4

맞지만 컴파일러는 다른 장소에서 호출하지 않는다고 확인할 수 없습니다. – Sameer

+0

@AlanDert :'another place'는 메서드가 private이므로 클래스의 다른 메서드에서 호출 할 수 있기 때문에 같은 클래스가됩니다. –

1

final 변수는 해당 변수의 감속시에만 초기화되거나 또는 생성자를 통해 초기화 할 수도 있습니다.

예 : 클래스 또는 생성자에서 선언 된 장소에서

class MyClass{ 
private final int intVar; 
    private final Paint paint; 

    public MyClass(){ 
    intVar = 12; 
    paint= new Paint(); 
} 
} 
1

코드에서 최종 변수를 초기화하지 않았습니다. 이 변수는 BLANK FINAL 변수라고합니다. 이제 생성자에서 초기화해야합니다. 그렇지 않으면 변수 값이 널 (NULL)이 G로 오류가 발생합니다.