Java - как метод или внутренний класс или класс? - PullRequest
4 голосов
/ 14 марта 2012

Итак, я наткнулся на несколько способов реализации ActionListener, и мне интересно, сможет ли кто-нибудь объяснить мне, как работает каждый из них, и есть ли причины или преимущества для использования одного над другим?

Первый находится ниже в блоке кода:

public void actionPerformed(ActionEvent arg0) {
// CODE HERE
}

Второй способ, который я увидел, был в другом блоке кода:

private class myListener implements ActionListener {
// CODE HERE
}

Третий был просто иметьотдельный класс для ActionListener, с кодом, аналогичным описанному выше, но внутри отдельного класса.

Мне интересно, является ли методный подход более эффективным, поскольку не нужно создавать новые объекты для каждого, выпросто укажите this как ActionListener, а не, например, ссылку new myListener().Спасибо.

Ответы [ 3 ]

6 голосов
/ 14 марта 2012

Нет разницы в скорости ни в одном из вариантов;у вас всегда будет объект, который реализует интерфейс ActionListener.Избегание экземпляра отдельного класса просто сэкономит вам несколько байтов памяти.

Ваш выбор действительно должен быть основан на том, что имеет смысл для вашего кода, структурно.Например, если ваш открытый класс реализует ActionListener, это может показаться странным для тех, кто использует этот класс, особенно если поведение ActionListener предполагается частным для класса и не используется вне его.

Так что это в основном выборо том, что вы думаете, выглядит лучше в вашем коде;единственное реальное отличие будет в том, что касается доступа к полю / методу (например, отдельный не внутренний класс не будет иметь доступа к закрытым методам и полям вашего класса, анонимный внутренний класс не может получить доступ к неконечным переменнымметод ограждения и т. д.).

2 голосов
/ 14 марта 2012

Мне не нравится или я использую "Implements ActionListener".

Мне нравится и я использую анонимные внутренние классы, такие как:

    btnPurplescreen.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Color baseColor = Color.BLUE;
            panelImage.setBackground(baseColor);
            panelReference.setBackground(baseColor);
            panelReference2.setBackground(baseColor);
            baseType = BaseType.PURPLE;
        }
    });
1 голос
/ 14 марта 2012

Ты спотыкаешься больше, чем этот.

В некотором смысле, существует только один способ создания слушателя: должен существовать объект класса, который реализует ActionListener, что означает, что класс имеет метод actionPerformed.

Есть три способа сделать это:

Вы можете изменить класс, который вы уже используете, для чего-то другого, пометив его как реализующий ActionListener и добавив метод actionPerformed. Это избавляет вас от создания нового класса - в большинстве случаев это экономит ничтожно малую ценность, но в остальном дает совершенно хороший код. Несколько случаев, когда существующий

Вы можете создать новый класс . Это полезно, если вы думаете, что имя будет иметь смысл для кого-то. Если вы действительно используете такие имена, как «MyListener», это подсказка, что нет, никто не заботится об имени.

Наконец, и обычно вы можете создать безымянный класс. Если вам нужно только добавить фрагмент кода в качестве прослушивателя.

Независимо от вашего выбора, крайне вряд ли окажет какое-либо заметное влияние на время или производительность памяти вашей готовой системы. Выбор должен быть продиктован заботой о читаемости и ремонтопригодности.

...