2017-12-10 2 views
3

안드로이드 앱을 만드는 동안 내부 클래스에서 최종 변수가 아닌 변수에 액세스하는 것과 관련하여 문제가 발생했습니다. 참조 용으로 This을 사용하십시오.내부 클래스 내부에서 for 루프 변수에 액세스하는 모범 사례

이 작업을 수행하는 데 "적절한"효과적인 방법은 무엇입니까? 내 두 솔루션은 다음과 같습니다 :

for (Button b : buttonArray) { 
     final Button bb = b; 
     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       text.append(bb.getText().toString()); 
       //Appending "1".."0" to a textView 
      } 
     }); 
    } 

또는

for (final Button b : buttonArray) {...} 

이 더 좋은 방법을 제안 주시기 바랍니다 //. 나중에 코드를 아름답게하기 위해 람다 식을 사용하려고합니다.

+0

이 예에 대한 적절한 방법은'v'을 사용하는 것입니다 prolly 청취자 – Selvin

답변

1

가이 사이의 성능 차이 없습니다 :

for (Button b : buttonArray) { 
     final Button bb = b; 
    ... 
    ... 

은이 : 그러나

for (final Button b : buttonArray) {...} 

, 나는 새로운 변수를 만들 중복으로 볼 때문에 나는 두 번째 접근 방식을 권하고 싶습니다 이 변수는 반복 변수와 동일한 객체를 메모리에서 가리킨다. 그것은 이미 을 만족이 경우, 우리는 심지어 최종으로 반복 변수를 선언 할 필요가 없습니다

for (Button b : buttonArray) { 
    b.addActionListener(v -> { 
     text.append(b.getText().toString()); 
    }); 
} 

참고 :

또한, 람다를 사용하여 당신과 당신의 코드 청소기를 만들 수 있습니다 효과적으로 최종 규칙. 여담으로

, 당신은 같은 스트림의 사용으로 전체 코드를 변환 할 수 있습니다 :

Arrays.stream(buttonArray).forEach(button -> { 
     button.addActionListener(v -> { 
      text.append(button.getText().toString()); 
     }); 
}); 
0

대신 foreach 루프가 작동하는 방식 대신 'final'키워드가 어떻게 작동하는지 질문하지 않는 것으로 생각합니다. 한 번에 하나의 인스턴스를 가져 와서 foreach 루프가 작동하는 한 두 선언 모두 효율적이어야합니다.

+0

참조 인스턴스를 하나만 사용 질문의 첫 번째 줄 : "내부 클래스에서 최종 변수가 아닌 변수에 액세스하는 것과 관련하여 문제가 발생했습니다." 따라서 내부 클래스에서 최종/최종 변수에 액세스하는 것입니다. 그러나 결국 그것은 foreach 루프 관련 질문이되었습니다. – ruben

관련 문제