Как передать параметры анонимному классу? - PullRequest
140 голосов
/ 24 февраля 2011

Можно ли передать параметры или получить доступ к внешним параметрам анонимному классу? Например:

int myVariable = 1;

myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // How would one access myVariable here?
    }
});

Есть ли способ для слушателя получить доступ к myVariable или быть переданным myVariable без создания слушателя как фактического именованного класса?

Ответы [ 11 ]

0 голосов
/ 09 сентября 2014

Я думал, что анонимные классы в основном похожи на лямбды, но с худшим синтаксисом ... это оказывается правдой, но синтаксис еще хуже и заставляет (что должно быть) локальные переменные вытекать в содержащий класс.

Вы не можете получить доступ к окончательным переменным, превратив их в поля родительского класса.

Например,

Интерфейс:

public interface TextProcessor
{
    public String Process(String text);
}

Класс:

private String _key;

public String toJson()
{
    TextProcessor textProcessor = new TextProcessor() {
        @Override
        public String Process(String text)
        {
            return _key + ":" + text;
        }
    };

    JSONTypeProcessor typeProcessor = new JSONTypeProcessor(textProcessor);

    foreach(String key : keys)
    {
        _key = key;

        typeProcessor.doStuffThatUsesLambda();
    }

Я не знаю, разобрались ли они в java 8 (я застрял в мире EE и еще не получил 8), но в C # это будет выглядеть так:

    public string ToJson()
    {
        string key = null;
        var typeProcessor = new JSONTypeProcessor(text => key + ":" + text);

        foreach (var theKey in keys)
        {
            key = theKey;

            typeProcessor.doStuffThatUsesLambda();
        }
    }

Выне нужен отдельный интерфейс в C # либо ... Я скучаю по нему!Я делаю худшие проекты в java и повторяюсь больше, потому что объем кода + сложность, которую вы должны добавить в java для повторного использования чего-либо, хуже, чем просто копировать и вставлять большую часть времени.

...