2016-09-05 10 views
1

에 일부 변수의 범위를 확장하는 방법을 나는 익명의 클래스를했습니다.익명의 내부 클래스

시도했지만 실패했습니다. 바깥 쪽 블록에서 최종 변수를 선언하면 내부에서 다시 초기화 할 수 없으므로 작동하지 않습니다.

+0

익명 내부 클래스 사용을 피하고 한 번 내부 클래스였던 클래스에 수정하려는 개체를 삽입 할 수 있습니다. – byxor

답변

1

여기에 값을 저장하는 데 도움이되는 "Holder"클래스를 사용하는 것이 좋습니다. 이는 데이터에 액세스 할 수있는 매우 유용한 메커니즘입니다. 개인적으로, 나는 don't think that having public scoped variables are a good idea입니다.

public class HoldThis { 

    private Uri downloadUri; 

    public void setUri(Uri uri){ 
     this.downloadUri = uri; 
    } 

    public Uri getUri(){ 
     return downloadUri; 
    } 

} 

을 당신은 또한 다음과 같이 할 수있는 옵션이 있습니다 :

외부 클래스 :

그래서 당신은 잡아 게터/세터와 홀더 형 객체 가질 수 final Uri []uri = new Uri[1];을 다음을 수행 할 수 있습니다 uri[0] = taskSnapshot.getDownloadUrl();

+0

두 번째 옵션은 깨끗하고 쉽습니다. 감사 –

0

downloadUri 값을 설정하는 멤버 필드를 추가 할 수 있습니다. 메소드가 완료되면 스택 프레임은 메모리에서 지워지기 때문에 위의 코드를 유지하는 메소드에서는이를 설정할 수 없습니다.

1

문제는 쉽지 않습니다. 아시다시피, 익명의 내부 클래스에 대한 생각은 그것이 외부 컨텍스트로부터 "분리"될 수 있다는 것입니다. 로컬 변수를 내부적으로 사용할 때는 최종을 만들어야하는 이유가 여기에 있습니다.

그 해결의 "정상적인"방법 :처럼 둘러싸고있는 클래스에 필드을 추가

public class YourClass ... { 
    private Uri downloadUri; 

지금 당신의 내부 클래스는 해당 필드 downloadUri을 읽기 + 수정할 수 있습니다.

O : Ayushin이 제안했듯이, 둘러싼 클래스의 메서드를 호출하고 로컬로 만든 Uri 개체를 매개 변수로 제공 할 수 있습니다. 결국, "옳은 것"은 전반적인 컨텍스트/디자인에 크게 좌우됩니다.

+0

함수를 호출하고 함수의 매개 변수로 변수를 전달하는 방법은 어떻습니까? –

관련 문제