2017-03-01 4 views
1

내부 부울 대 :최종 부울 [] 결승전이 허용 다음 왜 Runnable를

final boolean [] success = new boolean[1]; 
    Thread httpThread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      HTTPConnect httpConnect = new HTTPConnect(getContext()); 
      success[0] = false 
      ... 
      if (whatever) 
      success[0] = true; 

그러나 다음과 같은 아닌가요?

final boolean success; 
    Thread httpThread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      HTTPConnect httpConnect = new HTTPConnect(getContext()); 
      success = false 
      ... 
      if (whatever) 
      success = true; 

여기서는 boolean success을 말합니다. 은 우선은 내가 범위 종료 후 힙에 선언이 살아남을하면서 지역 선언이, 범위를 잃게 때문에 그것이라고 생각하지만, final ArrayList<Foo> bar = new ArrayList<>() 같은 선언이 값을 할당 할 수 없으므로이 경우 될 것 같지 않습니다.

+1

, 당신은 질문이 작동하지 않는 이유 : '부울 성공을; 성공 [0] = 참;' 대답은 간단 success' 원시적 부울 값이 아닌 배열'때문이다. – Kiryl

+0

@Kiryl 그것은 오타였습니다. – ShrimpCrackers

답변

1

boolean 값을 실제로 배열에 래핑하므로 배열의 내용을 변경할 수 있지만 변수 success 자체의 참조는 변경하지 않습니다.

AtomicBoolean (또는 일반적으로 AtomicReference)을 사용하여 동일한 결과를 얻을 수 있습니다. 당신이 success가 참조 무엇을 변경하기 때문에

익명의 내부 클래스에 수정 된 변수의 문제는 허용되지 않습니다 다음 시나리오

boolean success; 
Thread httpThread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
    success = false; 
    .... 

이에서 발생한다. boolean[]을 사용하는 경우 success을 참조하지 않고 참조 된 개체에 포함 된 값을 변경하므로 아무런 문제가 없습니다.

1

우선 두 번째 예는 두 번째 오타가 있습니다. successboolean이므로 할당 문에 첨자를 넣지 않아야합니다. 나는 두 경우 모두 그 있으리라 믿고있어

success는 지역 변수입니다. 필드 인 경우 final을 제거하면 두 번째 대문자가 작동합니다 (아래 첨자를 제거한 후). 두 번째 방법은 로컬 변수에 대해 작동하지 않습니다

이유는 할당 된 후에 당신이 final 변수에 할당 할 수 있다는 것입니다. 이야기는 배열과 조금 다릅니다. 여전히 배열을 success에 할당 할 수는 없지만 배열의 요소에 새 값을 할당 할 수는 있습니다. 그래서 첫 번째 접근 방식이 효과가 있습니다. 이와 같은 배열을 사용하는 것은이 문제와 자바 메소드가 "out"인자를 가지고 있지 않은 문제를 다루는 일반적인 관용구입니다. 코드에서 불필요한 부분을 제거