【问题标题】:Variable scope in the code代码中的变量范围
【发布时间】:2009-10-04 23:09:13
【问题描述】:

我正在阅读 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 参考课程?

【问题讨论】:

  • 与javascript无关...

标签: java javascript gwt


【解决方案1】:

这是因为且仅因为在封闭方法中将 symbol 声明为 final。

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

【讨论】:

  • 从技术上讲,即使它不是final,它也会在范围内,尽管它不会编译。 (实际的区别是外部类中的同名字段将被隐藏(这是正确的术语吗?)。)
【解决方案2】:

该语言基本上通过称为闭包的功能在后台处理此问题。闭包将“符号”绑定到类。为了让它在 Java 中工作,变量必须是 final 的(它在这里)。

【讨论】:

  • 我觉得将其称为闭包令人困惑。这不是其他语言中的闭包,它们远不止于此。我会把它保存在匿名的内部类中。但这只是我的看法。
【解决方案3】:

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

(否和是,分别针对您的最后一个问题。)

【讨论】:

    【解决方案4】:

    是的,您需要复习一下您的 Java 技能。这种类型的编程在 Java 中很常见。正如其他人所说:由于符号是最终的,您可以从内部类访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多