2012-09-10 4 views
1

내가 bukkit 플러그인을 만드는 중이라서, 제가 그래프를 만들려면 MCStats라는 API를 사용하고있는 클래스의 인스턴스를 만들려면 ...과 같이 플로터를 추가루프 내부 기능

mobs.addPlotter(new Metrics.Plotter("Player") { 

    @Override 
     public int getValue() { 
      return 0; 
     } 

}); 

내가 마지막으로 설정 한 경우하지만 ...는 HashMap,이 같은 idealy 일에서

for(String mob: mobNames) { 
    mobs.addPlotter(new Metrics.Plotter(mob) { 

     @Override 
      public int getValue() { 
       return Stats.getValue(mob); 
      } 

    }); 
} 

그러나 분명히 값을 얻으려면, 그것은, 폭도 변수에 액세스 할 수 없습니다, 그것은 여전히 ​​않을 수 있습니다 루프에서 변경하십시오. 이 문제를 해결하려면 어떻게해야합니까?

+3

왜'getValue()'는 Plotter 생성자에 전달 된 mob 이름을 사용하지 않습니까? – sjr

+3

루프 변수를 '최종'으로 설정하지 않는 이유는 무엇입니까? 그렇게하면 각 반복을 변경할 수는 있지만 반복 할 때마다 * 변경하지는 않습니다. –

+0

@sjr - 'mob'를 생성자에 전달해도 이름의 새 범위가 만들어지지 않습니다. getValue의'mob'에 대한 참조는 생성자 매개 변수가 아니라 루프 변수에 대한 것입니다. OP의 문제는 'final'이 아니면 내부 클래스가 로컬 변수를 참조 할 수 없다는 것입니다. –

답변

2

당신은, 사실, 향상된 for 루프 final를 사용할 수 있습니다

for(final String mob: mobNames) { 
    mobs.addPlotter(new Metrics.Plotter(mob) { 

     @Override 
      public int getValue() { 
       return Stats.getValue(mob); 
      } 

    }); 
} 
+0

감사합니다. 실제로 이것을 알지 못했습니다. P는 문자 그대로 더 이상 변경할 수 없다는 것을 의미합니다. –

+2

@DanSpiteri - The [Java Language Specification] (http://docs.oracle.com/javase/specs/jls /se7/html/jls-14.html#jls-14.14.2)에서는 컴파일러가 확장 for 루프를 기본 for 문으로 변환하는 방법을 설명합니다. 루프 변수는 기본 'for'루프 본문에 _inside_ 선언 된 변수로 끝나기 때문에 매번 루프를 통해 다시 선언됩니다 (해당 한정자가 있으면 'final' 변수로 사용). –

0

당신은 마피아의 최종 키워드를 사용할 수 있으며 여전히 루프에서 변경 될 수있다. "2"

public class Test2 { 

    public static void main(String args[]) { 
     String[] data = new String[] {"1", "2"}; 
     List<MyClass> test = new ArrayList<MyClass>(); 
     for (final String word: data) { 
      test.add(new MyClass() { 
       @Override 
       public void testMethod() { 
        System.out.println(word); 
       } 
      }); 
     } 
     for (MyClass myClass: test) { 
      myClass.testMethod(); 
     } 
    } 

    static class MyClass { 
     public void testMethod() { 

     } 
    } 
} 

출력은 "1"이 될 것입니다 : 다음이 코드를 실행 해보십시오.