我正在浏览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课程?
答案 0 :(得分:3)
这是因为并且只是因为符号在封闭方法中被声明为final。
以下是Java中匿名类的简要说明的链接:see here。
答案 1 :(得分:1)
该语言基本上在后台处理了一个名为Closure的功能。闭合将“符号”绑定到类。为了使它在Java中工作,变量必须是final(它在这里)。
答案 2 :(得分:0)
请注意symbol
声明中的关键字“final”。
(不,是的,分别是你的最后问题。)
答案 3 :(得分:0)
是的,您需要重新学习Java技能。这种类型的编程在Java中很常见。正如其他人所说:因为符号是最终的,你可以从内部类中访问它。