我正在尝试为我正在构建的 Android 应用创建一个轻量级、线程安全的应用内发布/订阅机制。我的基本方法是跟踪IEventSubscriber<T>
每个事件类型 T 的列表,然后能够通过传递类型 T 的有效负载将事件发布到订阅对象。
我使用泛型方法参数(我认为)确保以类型安全的方式创建订阅。因此,我很确定,当我从订阅映射中获取订阅者列表时,需要发布一个我可以将其转换为 列表的事件IEventSubscriber<T>
,但是,这会生成未经检查的转换警告。
我的问题:
- 未经检查的演员在这里真的安全吗?
- 我如何才能真正检查订阅者列表中的项目是否实现
IEventSubscriber<T>
? - 假设(2)涉及一些令人讨厌的反思,你会在这里做什么?
代码(Java 1.6):
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CopyOnWriteArraySet;
public class EventManager {
private ConcurrentMap<Class, CopyOnWriteArraySet<IEventSubscriber>> subscriptions =
new ConcurrentHashMap<Class, CopyOnWriteArraySet<IEventSubscriber>>();
public <T> boolean subscribe(IEventSubscriber<T> subscriber,
Class<T> eventClass) {
CopyOnWriteArraySet<IEventSubscriber> existingSubscribers = subscriptions.
putIfAbsent(eventClass, new CopyOnWriteArraySet<IEventSubscriber>());
return existingSubscribers.add(subscriber);
}
public <T> boolean removeSubscription(IEventSubscriber<T> subscriber,
Class<T> eventClass) {
CopyOnWriteArraySet<IEventSubscriber> existingSubscribers =
subscriptions.get(eventClass);
return existingSubscribers == null || !existingSubscribers.remove(subscriber);
}
public <T> void publish(T message, Class<T> eventClass) {
@SuppressWarnings("unchecked")
CopyOnWriteArraySet<IEventSubscriber<T>> existingSubscribers =
(CopyOnWriteArraySet<IEventSubscriber<T>>) subscriptions.get(eventClass);
if (existingSubscribers != null) {
for (IEventSubscriber<T> subscriber: existingSubscribers) {
subscriber.trigger(message);
}
}
}
}