2013-07-05 7 views
0

Я проектирую небольшую библиотеку, и иногда я пишу пару строк, и это просто не кажется правильным, поэтому я хотел бы получить мнения/советы экспериментального Java-программиста.Советы по Java

Ive получил слушатель, который обрабатывать 3 Differents события и в одном из моего класса я реализовать методы, которые на самом деле огонь.Пушку событий

Так что я сделал в первом был что-то вроде этого:

protected final void fireOperationStarted(){ 
    OperationEvent event = new OperationEvent(this); 

    for (OperationListener listener : listeners) { 
     listener.operationStarted(event); 
    } 
} 


protected final void fireOperationEnded(){ 
    OperationEvent event = new OperationEvent(this); 

    for (OperationListener listener : listeners) { 
     listener.operationEnded(event); 
    } 

//omitted the 3rd method on purpose 

, но этот код был ошибочным, потому что, если кто-то хочет реализовать свое собственное событие, ему в основном понадобится доступ к всем слушателям (CopyOnWriteArraylist) и снова и снова писать логику.

Так что я выбрал интерфейс Fireable с единственным методом «огонь». И это то, что я сделал:

protected final void fireOperationStarted(){ 
fireOperation(new Fireable(){ 

    @Override 
    public void fire(OperationListener listener, OperationEvent event) {    
     listener.operationStarted(event); 
    } 

}); 
} 

protected final void fireOperationEnded(){ 
fireOperation(new Fireable(){ 

    @Override 
    public void fire(OperationListener listener, OperationEvent event) {    
     listener.operationEnded(event); 
    } 

}); 
} 

protected void fireOperation(Fireable fireable){ 

    OperationEvent event = new OperationEvent(this); 

    for (OperationListener listener : listeners) { 
    fireable.fire(listener, event); 
    } 
} 

Я хотел бы получить ваше мнение, я лично думаю, что его лучше, чем первая реализация даже есть еще много шаблонного кода. Может быть, есть лучший способ сделать это? Я посмотрел в исходном коде пакета java.awt.events, чтобы узнать, как они имеют дело с несколькими событиями и как они запускают их, но это кажется слишком сложным для моих нужд.

Одна вещь, о которой мне было интересно, также относится к выражению лямбда в Java 8, если я использую их без импорта каких-либо пакетов Java 8 и компиляции, будет ли она работать на JRE7?

Может быть здорово использовать JDK8, чтобы в конечном итоге улучшить мои коды.

Благодарим за помощь!

+0

На ваш вопрос о lambdas: нет, их реализация включает в себя изменения в компиляторе и на виртуальной машине, а также в библиотеках. Для их выполнения вам понадобится JRE 8. –

+0

Но - я знаю вас это, но для других людей, которые посещают этот вопрос - на самом деле теперь есть backport лямбда-выражений для Java 5-7: http://blog.orfjackal.net/2013/07/lambda-expressions- портированном к Java-7.html –

ответ

0

Я думаю, что ваш первый пример лучше. listeners должен быть полем экземпляра и так легко доступен всем.

(Вы можете иметь только один метод в OperationListener и использовать значение в OperationEvent, чтобы определить, какое действие участвует. Тогда ваши методы могли бы все пройти надлежащее событие один метод, который вызывает метод один слушатель.)

Ваша вторая идея интересна, но для использования внутри одного экземпляра одного класса, я думаю, что это слишком много.

Существует множество способов хранения слушателей. Если вы не добавляете и не удаляете их слишком быстро, ArrayList хорош. Если есть вероятность добавить и удалить их на разных потоках, и вы часто вызываете слушателей, CopyOnWriteArrayList намного лучше.

Не беспокойтесь о «шаблоне». Java имеет тенденцию идти с многословным, но простым в отношении кода низкого уровня. Две петли for в вашем первом примере вызовут комбинацию как-то, но об этом не стоит беспокоиться, пока у вас нет еще лота.

Lambdas сократит ваши строки кода (если вы используете простые, мои C# lambdas все закончите работать на 20 строк или более, также могут быть анонимными классами!), Но они добавят много страниц на язык руководство. Тем не менее, лямбда не существует до JRE 8.

Смежные вопросы