Java "события" - не более, чем интерфейсы. Зачем притворяться, что это События, когда это обычный интерфейс и классы, реализующие этот интерфейс? - PullRequest
1 голос
/ 07 января 2010

Я в основном разрабатываю в .NET C # и мне нравятся события в C #.

Сейчас я занимаюсь чем-то вроде Android и поэтому должен иметь дело с Java. При переносе некоторого кода из C # в Java я столкнулся с проблемой событий; В Java нет ничего, что соответствует событиям C #.

Итак, читая о том, как Java обрабатывает «события», я могу сделать вывод, что это не так. В Java нет такого понятия, как «события». Вместо этого они используют обычные интерфейсы и классы, которые реализуют эти интерфейсы.

В Java: Во-первых, вы должны сначала создать интерфейс Затем все классы, которые хотят слушать «событие», должны реализовать этот интерфейс. Затем класс, который запускает «событие», должен хранить список всех слушателей (некоторый массив) Затем класс, который запускает «событие», должен иметь метод, чтобы слушатели могли добавлять себя в массив

И когда класс запуска решает «запустить событие», он должен перебирать массив слушателей, вызывая методы.

Это просто использование интерфейса, а не события в моем мире.

Я не прав?

Ответы [ 5 ]

5 голосов
/ 07 января 2010

Никто не "притворяется". Концепции Java были реализованы задолго до того, как был разработан C #. События в C # на самом деле одно и то же; хотя они проще для программиста. То есть переменная события C # поддерживает список методов подписки на события, и подписчики могут добавлять и удалять ссылки на методы из этого списка. Событие предоставляет способ для класса-владельца вызвать событие.

Какое у вас определение "событие"? Это шаблон проектирования, предназначенный для отделения одной системы классов от другой. Другие классы могут подписаться на получение уведомления о событии в любом случае (C # или Java), отличаются только реализация этой подписки и триггер сообщения.

В C # вы должны определить сигнатуру метода события (делегат). Это то, что делают интерфейсы.

Что в C # добавляет, что в Java нет возможности передавать ссылки на методы (delegate, хотя теперь я понимаю, что это может стать доступным в Java 7, по крайней мере, на уровне JVM). Поскольку в Java этого не существует, должен существовать другой способ предоставления получателя события (шаблона проектирования наблюдателя), который должен быть объектом, и наилучшим средством для определения этого является интерфейс - да, вы можете использовать абстрактный класс, но это серьезно ограничило бы типы получателей.

3 голосов
/ 07 января 2010

Это действительно обычные интерфейсы, хотя и с соглашением об именовании и реализации - XXXListener и анонимные внутренние классы. Я думаю, что это хорошо и работает достаточно хорошо - основной язык не должен быть раздутым (возможно, слишком резким словом для этого - я не хочу начинать войну пламенем) понятием «событий».

AFAIK Android черпает вдохновение для этого паттерна из Swing.

Обратите внимание, что большинство языков не имеют языковой конструкции для таких шаблонов, как Singleton, Observer, ... нет необходимости, если шаблоны могут быть легко реализованы - если это немного сложнее, это может быть реализовано библиотеками, инструментарий или рамки.

2 голосов
/ 07 января 2010

JavaBeans это все о «соглашении над конфигурацией». :-P События создаются просто имея методы с именами addXXXListener, removeXXXListener и getXXXListeners, где используемые типы происходят из интерфейса слушателя.

Аналогичным образом, свойство создается просто с помощью методов с именами getXXX и setXXX (может быть опущен для свойств только для чтения или только для записи).

Как программа находит события и свойства? Используя java.beans.Introspector, что позволяет использовать эти соглашения об именах.

Иногда самое простое - лучшее. : -D

0 голосов
/ 07 января 2010

В Java события представляют всю активность, которая происходит между пользователем и приложением. Java Window Abstract Tooling Toolkit (AWT) передает эти действия программам, используя события.

0 голосов
/ 07 января 2010

Для пояснения, способ, которым Android SDK реализует и представляет концепцию события, отличается от языка Java. Различные наборы инструментов (т. Е. Swing, SWT) имеют свой собственный способ ведения дел.

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