2017-08-04 97 views
2

我正在研究Java事件管理器,并且我想向它添加新的未来。 它是自定义类选择或自定义匹配类系统。抽象类中的同步

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); 
} 

的结构方法classSelection ClassSelector必须同步,因为callEvent正在使用具有多个线程的ThreadPool,并且只有一个ClassSelector实例。

但是同步关键字不是从超类继承的。我需要建议,如何通过更改代码或更改逻辑来解决此问题。

+0

无关:查看您的方法命名。通常他们去动词对象。所以'classSelection()'不是理想的... – GhostCat

回答

3

这是很简单:当你抽象基类需要“限制”以某种方式的方法(如:您要执行的方法是​​) - 那么该方法不应该是抽象的。

而是实现一个方法,使之最终

public abstract class ClassSelector{ 
    public final synchronized List<Class<?>> getClassSelection(Class<?> clazz) { 
    return getSpecificClasses(clazz); 
    } 

    protected abstract List<Class<?>> getSpecificClasses(Class<?> clazz); 

现在很明显,你的类的用户应该调用的公共方法 - 而每个子类只能实现的东西是保证以同步方式被调用。

(方法命名是不是真的太好了 - 只是意味着作为例子)

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自己的非同步版本。

+0

也许我得到了最后一个! –