代码中的变量范围

时间:2009-10-04 23:09:14

标签: java javascript gwt

我正在浏览GWT的教程,并对这段代码感到困惑。

代码位于GWT tutorials

private void addStock() {
        final String symbol = newSymbolTextBox.getText().toUpperCase().trim();
        newSymbolTextBox.setFocus(true);

        // Stock code must be between 1 and 10 chars that are numbers, letters,
        // or dots.
        if (!symbol.matches("^[0-9A-Z\\.]{1,10}$")) {
            Window.alert("'" + symbol + "' is not a valid symbol.");
            newSymbolTextBox.selectAll();
            return;
        }

        newSymbolTextBox.setText("");

        // Don't add the stock if it's already in the table.
        if (stocks.contains(symbol))
            return;

        // Add the stock to the table.
        int row = stocksFlexTable.getRowCount();
        stocks.add(symbol);
        stocksFlexTable.setText(row, 0, symbol);
        stocksFlexTable.setWidget(row, 2, new Label());
        stocksFlexTable.getCellFormatter().addStyleName(row, 1,
                "watchListNumericColumn");
        stocksFlexTable.getCellFormatter().addStyleName(row, 2,
                "watchListNumericColumn");
        stocksFlexTable.getCellFormatter().addStyleName(row, 3,
                "watchListRemoveColumn");

        // Add a button to remove this stock from the table.
        Button removeStockButton = new Button("x");
        removeStockButton.addStyleDependentName("remove");
        removeStockButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                int removedIndex = stocks.indexOf(symbol);
                stocks.remove(removedIndex);
                stocksFlexTable.removeRow(removedIndex + 1);
            }
        });
        stocksFlexTable.setWidget(row, 3, removeStockButton);

        // Get the stock price.
        refreshWatchList();
    }

问题部分是将事件处理添加到 removeStockButton 的匿名内部类。类'onClick方法接受一个事件,然后使用变量 symbol 从ArrayList stocks 中检索要删除的行的索引。

当用户实际调用onClick()时, symbol 仍然在范围内,即点击删除按钮?如果您怀疑代码的正确性,那么它来自Google工程师,因此是正确的(另外,它有效,我已经使用过它了。)

这是一些JavaScript技巧还是我需要Java referesher课程?

4 个答案:

答案 0 :(得分:3)

这是因为并且只是因为符号在封闭方法中被声明为final。

以下是Java中匿名类的简要说明的链接:see here

答案 1 :(得分:1)

该语言基本上在后台处理了一个名为Closure的功能。闭合将“符号”绑定到类。为了使它在Java中工作,变量必须是final(它在这里)。

答案 2 :(得分:0)

请注意symbol声明中的关键字“final”。

(不,是的,分别是你的最后问题。)

答案 3 :(得分:0)

是的,您需要重新学习Java技能。这种类型的编程在Java中很常见。正如其他人所说:因为符号是最终的,你可以从内部类中访问它。