2012-09-10 38 views
1

我想提出一个bukkit插件,和我使用所谓的MCStats的API,创建图形类的实例,你添加绘图仪是这样的...遍历HashMap来创建内部功能

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()'这里不使用传递给绘图仪构造函数的怪名? – sjr

+3

为什么不将循环变量设置为'final'工作?这样做会导致它改变每次迭代,但不会*在每次迭代中*。 –

+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

谢谢,我实际上并不知道这一点:我认为它的字面意思是它不能再被改变 –

+2

@DanSpiteri - [Java语言规范](http://docs.oracle.com/javase/specs/jls /se7/html/jls-14.html#jls-14.14.2)描述了编译器如何将增强的for循环转换为基本的for语句。循环变量作为变量声明_inside_是基本的'for'循环体,因此每次通过循环时都会重新声明它(如果有修饰符,则作为'final'变量)。 –

0

可以使用final关键字的暴民,它仍然在循环中改变。 尝试下面运行该代码:

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” 和 “2”。