我正在研究Java Event Manager,我想为它添加新的未来。 它是自定义类选择,或自定义匹配类系统。
EventManager eventManager = new EventManager();
如何将新的类选择器设置为事件管理器:
eventManager.setClassSelector(Class<? extends ClassSelector> classSelector);
eventManager.setClassSelector(ClassSelector classSelector);
使用类选择器的方法:
eventManager.callEvent(event);
有ClassSelector的结构
public abstract class ClassSelector{
public List<Class<?>> classSelection(Class<?> clazz);
}
ClassSelector中的方法 classSelection 必须同步,因为callEvent使用的ThreadPool包含多个Threads且只有一个ClassSelector实例。
但同步关键字不是从超类继承的。我需要建议,如何通过改变代码或改变逻辑来解决这个问题。
答案 0 :(得分:3)
这很简单:当你的抽象基类需要以某种方式“限制”某个方法时(比如:你想强制执行该方法是synchronized
) - 那么方法不应该是抽象的。
而是实现该方法并使其成为最终:
public abstract class ClassSelector{
public final synchronized List<Class<?>> getClassSelection(Class<?> clazz) {
return getSpecificClasses(clazz);
}
protected abstract List<Class<?>> getSpecificClasses(Class<?> clazz);
现在很明显,您的类的用户应该调用该公共方法 - 并且每个子类只能实现在同步中调用保证的内容方式。
(方法命名并不是很好 - 只是作为例子)
答案 1 :(得分:2)
你可以使classSelection
成为一个真正的方法,它调用一个抽象方法。然后,每个子类只提供抽象方法的实现。这可能看起来像这样。
public abstract class ClassSelector{
public synchronized final List<Class<?>> classSelection(Class<?> clazz) {
return doClassSelection(clazz);
}
protected List<Class<?>> doClassSelection(Class<?> clazz);
}
final
会阻止某人覆盖您的限制,并实施他们自己的classSelection
非同步版本。