2012-07-03 2 views
8

내부 클래스 내부의 변수를 변경해야하고 "다른 메서드에 정의 된 내부 클래스 내부의 최종 변수를 참조 할 수 없습니다"오류가 있습니다.내부 클래스 비 최종 변수 java

void onStart(){ 
    bt.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     int q = i; 
    } 
    }); 
} 

나는 빨리 내가 ​​변경을 원 모든 것들을 개최 클래스를 만들어이 보인다

class temp{ 
    int q; 
} 

void onStart(){ 
    final temp x = new temp(); 
    bt.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     x.q = i; 
    } 
    }); 
} 

내가 필요하고이를 위해 내부 클래스 외부 클래스의 최종 버전을 만든 작동하지만 문제를 올바르게 해결하는 방법인지 궁금합니다. 또한, 내 수업에 이름을 짓기 위해 temp이라는 단어를 사용하는 것이 정말 싫다. 내가했던 것을 실제로 프로그래밍 할 수있는 용어가있어서 수업을보다 잘 설명하는 이름을 만들 수 있습니까?

답변

9

익명 사용자 대신 내부 클래스를 만들면됩니다 (현재 수행중인 것처럼). 그런 다음 생성자와 멤버를 설정하려는 다른 메서드가 있습니다. 해킹이 필요하지 않습니다 (1 건의 배열과 같습니다).

클래스가 외부 클래스와 데이터를 교환해야하지만이 클래스가 개인적인 취향을 인정하는 경우이 클리너를 찾습니다. 1 관용구의 배열은 잘 작동 할 것이고 간결하지만 솔직히 말하면, 그것은보기 흉한 것처럼 보인다. 일반적으로 익명 내부 클래스는 외부 클래스의 데이터를 업데이트하지 않고 작업을 수행하는 클래스로만 제한됩니다. 예를 들어

은 : 관련된 여러 스레드가있는 경우

private MyListener listener = new MyListener(); 

void onStart(){ 
    bt.setOnClickListener(listener); 
} 

class MyListener implements OnClickListener 
{ 
    String name; 
    int value; 

    void setName(String newName) 
    { 
     name = newName; 
    } 

    void setValue(int newValue) 
    { 
     value = newValue; 
    } 

    public void onClick(View v) 
    { 
     // Use the data for some unknown purpose 
    } 
} 

, 다음 적절한 동기화뿐만 아니라 사용되어야 할 것이다.

+0

브라보. 다른 좋은 점은이 내부 클래스가 더 확장 가능하고 재사용 가능하다는 것입니다. IMO, 익명 내부 클래스는 거의 항상 나쁜 생각입니다. – user949300

+0

이들은 하나의 작업 스타일 클래스, 즉 입력을 기반으로 작업을 수행 할 수있는 특정 이벤트 처리기로 잘 작동합니다. 그의 예제 인 GUI 프로그래밍에서 매우 일반적입니다. 이 경우를 제외하고는 문제를 복잡하게하는 클래스 간의 상호 작용이 있습니다. – Robin

+0

이것은 내가 찾고 있었던 것이다! 감사! –

2

나는 other thread here에 비슷한 대답을 올렸다. 기본적으로 아이디어는 거의 모든 Object 유형을 감싸는 "래퍼"를 만드는 것입니다. Java에서 final은 "재 할당 없음"을 나타내며 "상수"가 아니기 때문에이 트릭은 잘 작동합니다. 그러나 원래 게시물에서 언급했듯이 다중 스레드 환경에서 사용할 때주의해서주의해야합니다.

0

외부 클래스의 클릭 수신기에 대한 참조를 유지하고 수신기 멤버 변수를 int로 변경합니다. 클릭 할 때 리스너에 변수를 저장 한 다음 클릭 할 때 변수를 설정하는 대신 필요에 따라 외부 클래스에서 변수를 가져옵니다.

간단히 말하면, 내부 클래스를 변경해야하는 경우에는 내부 클래스에서 변수로 변경하십시오.

0

여러 의견을 설정 한 것처럼 보일 수도 있으므로 (예 : doUpdate, doSave 등 더 좋은 이름을 버튼이 수행하는 것과 관련이있는) 기본 클래스에서 만들 수 있습니다. put 적절한 코드를 작성하고 내부 클래스/수신기에서 호출하십시오. (스윙을 사용한다면 YMMV 액션으로 만들 수 있습니다.)

나중에 동일한 물건을 실행해야하는 메뉴 나 의도 또는 제스처가 있다면 그 방법이 있습니다.

관련 문제