2011-05-01 7 views
4

"로컬 변수 상자가 내부 클래스에서 액세스되었으므로 최종 선언해야합니다."라는 오류 메시지가 나타납니다. 그건 괜찮은 것 같지만, 나는 그것이 최선의 해결책이라고 생각하지 않는다. 그래서 나는 다른 누군가가 나를 도울 수 있기를 바랬다.) (로컬 변수를 final로 선언해야합니다.

public void showPublisherBox(JComboBox box) { 
    if (publisherBox == null) { 
     publisherBox = new AddPublisherForm(); 
     publisherBox.setLocationRelativeTo(this); 
    } 
    publisherBox.addWindowListener(new WindowAdapter() 
    { 
    public void windowClosing(WindowEvent we) 
    { 
     this.populatePublishers(box); 
    } 

     private void populatePublishers(JComboBox box){ 
      box.setModel(db.getPublishers()); 
     } 
    }); 
    publisherBox.setVisible(true); 
} 

게시자 형태가 열리고 몇 가지 정보에 걸리는 단지 새로운 JFrame의이며,이 닫힐 때 나는 JComboBox에 나의 db.getPublishers에서 모델을 설정을 통해 다시 채워하려면 : 여기 내 코드입니다 방법.

내가 여기서하고있는 일을 할 수있는 더 좋은 방법이 있을까? 아니면 마지막으로 선언해야 할 것인가?

감사합니다.

답변

8

외부 코드에서 box을 수정하지 않으므로 final을 사용하면 정확하게 올바른 방법으로이 문제를 해결할 수 있습니다. box의 값은 엔클 로징 범위에서 변경되지 않는다는 것이 자신과 컴파일러에게 약속입니다. 컴파일러는 약속을 어기면 알려줍니다.

final을 사용할 때 컴파일 시간이나 런타임이 들지 않습니다.

1

아니요. 이 경우 최종으로 선언하십시오. 어쨌든 참조는 변경되지 않습니다.

1

로컬 클래스에서 사용하는 로컬 변수는 final로 선언해야합니다. 이 경우, 변수는 메서드 매개 변수이며, 어쨌든 할당하지 않으므로 final로 선언하지 않아도됩니다.

물론이 선언은 메서드 호출자에게 아무런 영향을주지 않습니다. 참조의 로컬 복사본은 메서드 본문에 의해 수정되지 않는다고 명시되어 있습니다.

4

익명의 내부 클래스 (예 : WindowAdapter)가 범위를 둘러싸는 변수 (예 : '상자')를 참조하는 경우 Java는 final으로 선언해야합니다.

public void showPublisherBox(JComboBox box) { 
    if (publisherBox == null) { 
     publisherBox = new AddPublisherForm(); 
     publisherBox.setLocationRelativeTo(this); 
    } 

    publisherBox.addWindowListener(new MyWindowClosingHandler(box, db)); 
    publisherBox.setVisible(true); 
} 

// ... 

class MyWindowClosingHandler extends WindowAdapter { 
    private JComboBox box; 

    MyWindowClosingHandler(JComboBox box, DB db) { 
     this.box = box; 
     this.db = db; 
    } 

    public void windowClosing(WindowEvent we) { 
     populatePublishers(); 
    } 

    private void populatePublishers(){ 
     box.setModel(db.getPublishers()); 
    } 
}); 

}

0

사용자가 입력해야하는 "최종 : boxfinal로 당신의 WindowAdapter 명명 된 클래스를 만드는 것입니다 선언하는 것을 피하기 위해

한 가지 방법, 즉 생성자 매개 변수로 box을 받아 "매번 변수를 선언 할 때마다 - 왜 Java가 final을 final로 설정하지 않고"Variable "키워드 또는 다른 것을 요구하는지 잘 모르겠습니다. 나는 대부분의 변수가 다르게 입증되지 않는 한 최종이어야한다고 말하고 있습니다.

즉 익명의 내부 클래스 대신 항상 전체 클래스를 만들고 변수를 생성자에 전달할 수 있습니다. 즉, "올바른"방법 일 것입니다. 익명의 내부 클래스는 어쨌든 나쁜 습관입니다. 코드 재사용을 막습니다. (내부 클래스는 다른 장소에서 리스너로 재사용 할 수 없지만 전체 클래스 인 경우 쉽게 재사용 할 수 있습니다.) 리팩토링시이 기술을 사용했습니다. 중복 코드의 거대한 더미를 제거하는 것.

+0

+1 로컬 변수 나 메소드 args에 관해서 나는 첫 단락에 동의한다. –

관련 문제