2017-11-18 11 views
0

종종 클래스 시작 부분에 @Inject 필드의 거대한 목록이 있습니다. 이것은 @Inject 어노테이션의 많은 중복 된 반복이다. 모든 주입 그룹화 한 후여러 필드를 @Inject로 표시하는 @InjectAll 주석

@Inject 
private Logger logger; 

@Inject 
private Event<String> simpleMessageEvent; 

: 개별적으로 각 필드에 주석을 이전

: 일부 사용자 지정 주석 마법을 사용

, 그것은 가능한 코드에서이 단순화를 가능하게하는 새로운 @InjectAll 주석을 작성하는 것입니다 한 그룹의 필드 :

@InjectAll { 
    private Logger logger; 
    private Event<String> simpleMessageEvent; 
} 

또는 더 컴팩트 한 코드를 작성할 수있는 동일한 구문을 사용합니까?

+0

Hehe, 나는 당신도 내 코드에서 당신과 같은 목록을 찾았고 ... 나에게 콩이 * 단일 책임 원칙을 어기고 * 리팩토링/재고 할 필요가 있다는 냄새가 난다. 당신이 묻는 것은 * 할 수 있습니다 * (CDI 확장 - 제안 된 구문이 아닌). 그러나 나는 그것이 행해져서는 안된다고 믿습니다. –

답변

0

귀하의 제안은 두 개의 자바 구문 오류를 포함

  • 할 수 있습니다하지 않는 블록의 그룹 필드 선언.
  • 블록에 주석을 달 수 없습니다.

당신은

@InjectAll({"logger", "simpleMessageEvent"}) 
public class MyClass { 
    private Logger logger; 
    private Event<String> simpleMessageEvent;  
} 

같은 것을 지원하는 CDI 확장을 만들 수 있습니다하지만 정말 덜 장황 필드에 직접 @Inject 주석을하는 것보다하지 않습니다.

+0

내 코드는 "순수 Java"가 아니며 Java 및 주석 구문을 개선하기위한 것입니다. Java는 아직 설정되지 않았으며 향후에는 특수한 필요를 수용하기 위해 언어 구문을 확장/사용자 정의 할 수 있습니다. 어쨌든 입력을 주셔서 감사합니다 ...하지만 문자열을 사용하여 필드를 참조하면 필드 이름 바꾸기가 중단됩니다. – PierluigiVernetto

0

CDI에는이를 달성 할 수있는 기본 방법이 없습니다. 언급 한 것처럼 상상력과 결합 된 CDI 확장을 사용하여 원하는대로 할 수있는 사용자 지정 구문을 만들 수 있습니다. 그러나 이렇게하면 작업이 훨씬 단순 해지지 않으며 복잡성을 추가하고 코드의 가독성을 떨어 뜨릴 수 있습니다.

나는 차라리 코드를 다시 살펴보고 각 클래스에 많은 주입이 필요한지 또는 클래스 별 책임을 균등하게 나누기 위해 여러 클래스로 리팩토링해야 하는지를 알고 싶습니다. 당신이 묘사하는 것은 흔히 모든 것을 다루는 "유버 입문 수업"의 경우입니다. 물론 그것은 실천이 최선이 아닙니다.