【问题标题】:Inner Class change external variable java内部类更改外部变量java
【发布时间】:2014-10-12 06:42:25
【问题描述】:

我在我的项目中使用 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”
在“franchSize.setValue("0");”中和
"franchSize.getWindow().showNotification("","Bla-bla-bla",Notification.TYPE_HUMANIZED_MESSAGE);"

【问题讨论】:

    标签: java class vaadin


    【解决方案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 了解您的错误发生的原因。 我在场景中唯一改变的是我将变量作为方法变量的类级别变量(成员变量)。

    【讨论】:

    • 你不只是将变量传递给内部类吗(他/她可以通过传递franchSize 来做同样的事情)? TextField 也是一个 vaadin 类,再次包装它是矫枉过正的,因为该值已经来自两个来源。
    • 是的,我只是在传递变量,因为我们不能直接在内部类中使用外部变量。
    【解决方案2】:

    这里的错误很明显:如果不将其设置为final,则无法访问内部类中的外部变量。所以只需在TextField franchSize = new TextField();前面加上final

    【讨论】:

      【解决方案3】:

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

      关于错误search SO的信息

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-04
          • 1970-01-01
          • 2013-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多