2017-03-10 3 views
6

Lombok.val 실제로 유형을 쓰는 지역 변수 선언의 형식 대신 로Lombok.val은 실제로 어떻게 작동합니까?

사용 발에 당신을 수 있습니다. 이렇게하면 형식이 이니셜 라이저 식에서 유추됩니다. 지역 변수도 최종 결정됩니다.

그래서 그 대신

final ArrayList<String> example = new ArrayList<String>(); 

의 당신은 내가이 실제로 어떻게 작동하는지에 대한 몇 가지 조사를하려고했습니다

val example = new ArrayList<String>(); 

쓸 수 있지만 수없는 것 엄청난 양의 정보. the github page을 보면 val이 주석 유형이라는 것을 알 수 있습니다. 그러면 실제 주석이 아닌 유형이 사용됩니다.

이런 식으로 주석 유형을 사용할 수도 있다는 것을 알지 못했지만 테스트 할 때 다음 코드가 실제로 유효합니다. 그러나, 나는 아직도 당신이 왜 이런 식으로 타입을 사용하고자하는지 확신 할 수 없다.

public class Main 
{ 
    public @interface Foo { } 

    public static void main(String... args) 
    {  
     Foo bar; 
     System.out.println("End"); 
    } 
} 
그들이 주석이없는 경우 이러한 용도 롬복 프로세스를 수행하는 방법

하지만, 주석 유형? 내 (분명 잘못된) 이해하려면, 구문이 더 좋아 보일 것입니다 :

@Val foo = new ArrayList<String>(); 

(주석 위의 의미로 내가 알고 제약을 해요 올바른 구문되지 않습니다) 롬복가 작동하기 위해서는

답변

14

에서, 소스 코드는 오류없이 구문 분석해야합니다. 그 이유는 이미 언급했듯이 @val foo = new ArrayList<String>();이 작동하지 않기 때문입니다.

Lombok은 주석과 주석 프로세서를 사용하지만 주석 프로세서는 컴파일러가 참여하는 수단으로 만 사용됩니다.

롬복에는 @val에 등록 된 프로세서가 없습니다. 대신 모든 Java 파일을 처리하고 전체 AST를 방문하고 val을 로컬 변수의 초기화 표현식 유형으로 바꿉니다.

공개 사항 : 저는 롬복 개발자입니다.

+0

고마워요! 훌륭한 도서관에 감사드립니다. 대체 할 대체품이있는 곳으로 안내해 줄 수 있니? 내가 관심. – Michael

+1

Eclipse 및 ecj의 경우 https://github.com/rzwitserloot/lombok/blob/master/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java 및 https://github.com/rzwitserloot/lombok/blob을 참조하십시오. /master/src/eclipseAgent/lombok/eclipse/agent/PatchValEclipse.java, javac에 대해서는 https://github.com/rzwitserloot/lombok/blob/master/src/core/lombok/javac/handlers/HandleVal.java를 참조하십시오. –