2017-08-04 33 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

也許我得到了最後一個! –