2012-06-03 5 views
3
다음 코드는 나에게주고 계속

를 참조 할 수 없습니다 :자바가 아닌 최종 변수

다른 방법 Login.java/ChurchWebLogin/SRC에 정의 된 내부 클래스 내부가 아닌 최종 변수 textBoxPassword을 참조 할 수 없습니다 /COM/GWT/churchweb/churchweblogin/클라이언트 라인 (61)

package com.gwt.churchweb.churchweblogin.client; 

import com.google.gwt.user.client.ui.Composite; 
import com.google.gwt.user.client.ui.VerticalPanel; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.FlexTable; 
import com.google.gwt.user.client.ui.TextBox; 
import com.google.gwt.user.client.ui.HasHorizontalAlignment; 
import com.google.gwt.user.client.ui.CheckBox; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.user.client.Window; 

public class Login extends Composite { 

    public Login() { 

     VerticalPanel verticalPanel = new VerticalPanel(); 
     initWidget(verticalPanel); 
     verticalPanel.setSize("329px", "186px"); 

     Label lblNewLabel = new Label("Sign into your account"); 
     lblNewLabel.setStyleName("gwt-Login-SigninLabel"); 
     verticalPanel.add(lblNewLabel); 

     FlexTable flexTable = new FlexTable(); 
     verticalPanel.add(flexTable); 
     flexTable.setWidth("308px"); 

     Label lblNewLabel_1 = new Label("Username:"); 
     lblNewLabel_1.setStyleName("gwt-Label-Login"); 
     flexTable.setWidget(0, 0, lblNewLabel_1); 
     lblNewLabel_1.setWidth("72px"); 

     TextBox textboxUsername = new TextBox(); 
     textboxUsername.setStyleName("gwt-LoginTextBox"); 
     flexTable.setWidget(0, 1, textboxUsername); 
     textboxUsername.setWidth("204px"); 

     Label lblNewLabel_2 = new Label("Password:"); 
     lblNewLabel_2.setStyleName("gwt-Label-Login"); 
     flexTable.setWidget(1, 0, lblNewLabel_2); 
     lblNewLabel_2.setWidth("66px"); 

     TextBox textBoxPassword = new TextBox(); 
     textBoxPassword.setStyleName("gwt-LoginTextBox"); 
     flexTable.setWidget(1, 1, textBoxPassword); 
     textBoxPassword.setWidth("204px"); 
     flexTable.getCellFormatter().setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT); 
     flexTable.getCellFormatter().setHorizontalAlignment(1, 0, HasHorizontalAlignment.ALIGN_LEFT); 

     CheckBox chckbxRememberMeOn = new CheckBox("Remember me on this computer"); 
     chckbxRememberMeOn.setStyleName("gwt-Checkbox-Login"); 
     flexTable.setWidget(2, 1, chckbxRememberMeOn); 

     Button btnSignIn = new Button("Sign In"); 
     btnSignIn.addClickHandler(new ClickHandler() { 
      public void onClick(ClickEvent event) { 
       if (textboxUsername.getText().length() == 0 
         || textBoxPassword.getText().length() == 0) { 
         Window.alert("Username or password is empty."); 
        } 
      } 
     }); 

     btnSignIn.setStyleName("gwt-Login-SigninButton"); 
     flexTable.setWidget(3, 1, btnSignIn); 



    } 


} 
+0

'accept'는 링크 외에도 도움이되는 정보를 제공하는 사람에게 감사의 말을 전합니다. 게시 옆의 위쪽 화살표를 클릭하는 것은 다른 방법입니다. 이것은 주석이 유용하다고 가정합니다 ... –

답변

5
final TextBox textboxUsername = new TextBox(); 

final TextBox textBoxPassword = new TextBox(); 

으로 수정해야합니다.

Java는 내부 클래스의 변수에 대한 참조가 final 인 변수가 필요합니다 (동시성 관리의 이유로).

+6

익명 함수의 실행이 검색되지 않기 때문에 변수의 실제 값을 확신 할 수없는 경우처럼 익명 클래스가 JVM에서 컴파일되고 실행되는 방법과 관련이 있습니다. 실행 중에 동적으로하지만 이전 단계에서,하지만 그냥 짐작했다. – Jack

+0

그것은 익명의 클래스가 아니에요; 내부 클래스입니다. –

+1

내부 클래스의 최종 필드에 액세스하는 것이 완벽합니다. 그렇지 않으면 코드의 90 %가 컴파일되지 않습니다.) 클래스가 익명이어서 메서드 내에서 선언 될 때 문제가 나타납니다. – Jack

4

로컬 변수는 내부 클래스에서 사용되는 경우 final으로 선언해야합니다. 당신이 작성해야 :

final TextBox textBoxPassword = new TextBox(); 
1

익명 클래스 인스턴스는 주변 범위의 지역 변수 및 매개 변수에 액세스 할 수 있어야합니다. 그러나 인스턴스가 (인스턴스의 참조를 필드에 저장 한 결과)으로 생각한 메서드보다 오래 지속되어 메서드가 반환 된 후에 더 이상 존재하지 않는 로컬 변수와 매개 변수에 액세스하려고 시도 할 수 있습니다.

Java에서는 가상 시스템 인 이 충돌 할 가능성이 높으므로 익명 클래스 인스턴스는 로컬 변수와 최종 매개 변수에만 액세스 할 수 있습니다. 의 컴파일러는 대체 (예를 들어, INT 또는 더블)

  • 변수의 타입이 원시적 인 경우 : 익명의 클래스 인스턴스에서 최종 지역 변수/매개 변수 이름을 발생하면, 컴파일러는 두 가지 중 하나를 수행합니다 변수의 읽기 전용 값이있는 이름.
  • 변수 유형이 reference (String) 인 경우 컴파일러 은 합성 변수 (제조 된 변수)와 로컬 변수/매개 변수의 참조를 합성 변수에 저장하는 코드를 클래스 파일에 도입합니다.