2013-07-05 3 views
0

나는 작은 라이브러리를 디자인하고 때때로 몇 줄을 쓴다. 그리고 그것은 옳다고 느끼지 않는다. 그래서 나는 실험 된 자바 프로그래머의 의견/조언을 얻고 싶다.자바가 조언을 필요로한다

필자는 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 

하지만이 코드는 누군가 자신의 이벤트를 구현하려는 경우 기본적으로 전체 청취자 arraylist (CopyOnWriteArraylist)에 액세스해야하며 논리를 반복해서 작성해야하기 때문에이 코드는 잘못되었습니다.

그래서 내가 선택한 것은 "fire"라는 단일 메서드가 포함 된 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 패키지를 가져 오지 않고 사용하고 JRE7에서 작동하는 경우 궁금한 점은 Java 8의 람다 식에 관한 것입니다.

JDK8을 사용하면 결국 코드를보다 명확하게 만들 수 있습니다.

도움 주셔서 감사합니다.

+0

lambdas : no에 대한 질문으로 컴파일러와 VM뿐 아니라 라이브러리도 변경해야합니다. 실행하려면 JRE 8이 필요합니다. –

+0

하지만이 질문을하는 다른 사람들에게도이 사실을 알고 있습니다. 실제로 자바 5 - 7에 대한 람다 식의 백 포트가 있습니다. http://blog.orfjackal.net/2013/07/lambda-expressions- backported-to-java-7.html –

답변

0

첫 번째 예가 더 좋습니다. listeners은 인스턴스 필드 여야하며 누구나 쉽게 사용할 수 있습니다.

이 (당신은 OperationListener에 단 하나의 방법을 가지고 참여하는 행동 결정 OperationEvent의 값을 사용할 수 있습니다. 그런 다음 방법은 모든 하나의 리스너 메소드를 호출 한 가지 방법에 대해 적절한 이벤트를 전달할 수 있습니다.)

두 번째 생각은 흥미 롭습니다. 그러나 한 클래스의 한 인스턴스 내에서 사용하기에는 과잉이라고 생각합니다.

다양한 방법으로 리스너를 저장할 수 있습니다. 너무 빨리 추가하거나 제거하지 않으면 ArrayList가 좋습니다. 다른 스레드에서 추가 및 제거 할 기회가 있고 리스너를 자주 호출하는 경우 CopyOnWriteArrayList가 훨씬 좋습니다.

'상용구'에 대해 너무 걱정하지 마십시오. 자바는 낮은 수준의 코드에 관해서는 말 그대로 단순한 경향이있다. 첫 번째 예제의 두 개의 for 루프는 어떻게 든 결합 될 것을 요구하지만 로트가 이상있을 때까지 걱정할 가치가 없습니다.

Lambdas는 간단한 코드를 사용하면 내 C# 람다가 모두 20 행 이상 실행되며 익명의 클래스 일 수도 있습니다.)하지만 언어에 많은 페이지가 추가됩니다 조작. 그러나 람다는 JRE 8까지 존재하지 않습니다.