Область видимости переменной в коде - PullRequest
0 голосов
/ 05 октября 2009

Я просматривал учебники для GWT и был смущен этим фрагментом кода.

Код в GWT учебники

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 принимает событие и затем получает индекс строки, подлежащей удалению, из ArrayList stocks , используя переменную symbol .

Как символ будет оставаться в области действия, когда пользователь фактически вызывает onClick (), т. Е. Нажимает кнопку удаления? Если вы сомневаетесь в правильности кода, он принадлежит инженерам Google и поэтому является правильным (плюс, он работает, я использовал его).

Это какой-то трюк с JavaScript или мне нужны курсы Java Reresher?

Ответы [ 4 ]

3 голосов
/ 05 октября 2009

Это потому, что и только потому, что символ был объявлен как заключительный в включающем методе.

Вот ссылка на краткое объяснение анонимных классов в Java: см. Здесь .

1 голос
/ 05 октября 2009

Язык в основном заботится об этом в фоновом режиме с помощью функции, называемой Closure. Закрытие связывает «символ» с классом. Для того, чтобы это работало в Java, переменная должна быть конечной (что здесь).

0 голосов
/ 05 октября 2009

Да, вам нужно освежить свои навыки Java. Этот тип программирования очень распространен в Java. Как говорили другие: поскольку символ является окончательным, вы можете получить к нему доступ из внутренних классов.

0 голосов
/ 05 октября 2009

Обратите внимание на ключевое слово "final" в объявлении symbol.

(Нет и Да, соответственно на ваши последние вопросы.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...