Question

I am making a bukkit plugin, and I am using an API called MCStats, to create the graph, you add Plotters like so...

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

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

});

But I want to get the values from a HashMap, and idealy something like this...

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

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

    });
}

But obviously, it can't access the mob variable, if I set it to final, it still wont be able to change in the loop. How can I work around this problem?

Was it helpful?

Solution

You can, in fact, use final in an enhanced for loop:

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

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

    });
}

OTHER TIPS

You can use the final keyword for mob and it still be changed in the loop. Try to run this code below:

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() {

        }
    }
}

The output will be "1" and "2".

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top