内部类更改外部变量java

时间:2014-08-19 08:25:18

标签: java class vaadin

我将Vaadin用于我的项目,我有一个问题:如何更改变量外部类franchSize?

                TextField franchSize = new TextField();
                franchSize.setDebugId("franch_size");
                hl1.addComponent(franchSize);
                franchSize.setValue("0");
                hl1.setComponentAlignment(franchSize,
                        Alignment.MIDDLE_CENTER);
                franchSize.addListener(new Property.ValueChangeListener() {
                    private static final long defaultValue = 0;
                    public void valueChange(ValueChangeEvent event) {
                        String value = (String) event.getProperty().getValue();
                        if(Integer.valueOf(value)%1==0){
                            franchSize.setValue("0");
                            franchSize.getWindow().showNotification("","Bla-bla-bla",Notification.TYPE_HUMANIZED_MESSAGE);
                        }
                    }
                });

错误:"不能在不同方法中定义的内部类中引用非最终变量franchSize"
in" franchSize.setValue(" 0");"和" franchSize.getWindow()。showNotification(""," Bla-bla-bla",Notification.TYPE_HUMANIZED_MESSAGE);"

4 个答案:

答案 0 :(得分:1)

这是一个与外部类变量

进行通信的简单实现
public class Google01 implements Outer{
    // outer class variable, see no final here
    int outer = 0;

    public static void main(String[] args) {
        Google01 inst = new Google01();
        inst.testMe();
    }

    public void testMe(){
        // Inner class
        class temp{
            Outer out;
            public temp(Outer out) {
                this.out = out;
            }
            public void printMe(String text){
                // reading outer variable
                System.out.println(out.getValue() + text);
                // setting outer variable
                out.setValue(out.getValue() + 1);
            }
        }

        // Lets start our test
        temp obj = new temp(this);
        System.out.println("Value of outer before call = " + outer);
        // this should increment outer value, see number before Yahoo in output
        obj.printMe("Yahooo");
        obj.printMe("Google");
        obj.printMe("Bing");
        // Lets print outer value directly.
        System.out.println("Value of outer after call = " + outer);

    }

    @Override
    public void setValue(int value) {
        outer = value;
    }

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

// An interface that is use to communicate with outer class variable.
interface Outer{
    void setValue(int value);
    int getValue();
}

<强>输出

Value of outer before call = 0
0Yahooo
1Google
2Bing
Value of outer after call = 3

简要说明: 你需要创建一个接口才能与外部类进行通信(我喜欢使用接口进行通信,但是也可以使用传递外部类实例而不是创建全新的接口来完成),并且可以使用接口提供的实用方法为了获得或把价值放在外层。 您可以参考this来了解错误发生的原因。 我在场景中唯一改变的是我已经从方法变量中将变量作为类级别变量(成员变量)。

答案 1 :(得分:0)

make franchSize final - 如错误消息中所述 - 或使用(TextField)event.getSource()而不是引用外部变量。

有关错误search SO

的信息

答案 2 :(得分:0)

这里的错误很清楚:你不能在内部类中访问外部变量而不能使它成为final。因此,只需在final

前添加TextField franchSize = new TextField();即可

答案 3 :(得分:0)

只需在外部类中创建一个(私有)字段“TextField franchSize”。 然后,访问它的最佳方法是使用受保护的getter。