2012-11-16 4 views
0

클래스의 필드를 정의하고이 특정 클래스의 참조를 사용할 수있는 솔루션을 찾고 있습니다. codemodel은 필드를 인스턴스화하는 메소드를 작성해야하며 필드 사용을 작성된 메소드로 바꿔야합니다.변수 사용을 코드 모델의 메서드로 바꿉니다.

누군가가 나를 도울 수 있기를 바랍니다. 당신이 일을 약간 변경하는 경우 codeModel 사용 후

처리되지 않은 클래스

public class MyClass { 
    @LazyInit 
    CustomClass member; 

    public void someMethod() { 
     System.out.println(member); 
    } 
} 

클래스

public class MyClass_ { 
    @LazyInit 
    CustomClass member; 

    public void someMethod() { 
     System.out.println(getInstanceOfMember()); 
    } 

    public member getInstanceOfMember() { 
     if (member == null) 
      member == new CustomClass(); 

     return member; 
    } 
} 
+0

무엇을 시도 했습니까? [읽어보십시오.] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) 코드를 게시 해보십시오. – durron597

+0

귀하의 질문에 명확하지 않다, 그것을 다시 시도해 주시겠습니까. 어쩌면 입력이 무엇인지에 대한 작은 예제를 제공하고 원하는 출력이 클리어 할 수 있습니다. –

+0

힌트를 보내 주셔서 감사합니다. 이 코드 예제로 질문을 업데이트했습니다. :) – alosdev

답변

0

,이 문제는 훨씬 더 관리하게된다. 변수를 추상 게터 메소드로 변경하면 생성 된 클래스에서 기본 클래스 만 남겨두고 지연 초기화를 수행 할 수 있습니다.

입력 클래스 :

public abstract class MyClass { 
    @LazyInit 
    public abstract CustomClass getMember(); 

    public void someMethod() { 
     System.out.println(getMember()); 
    } 
} 

생성 된 클래스 :

public class MyClass_ extends MyClass { 

    private CustomClass member; 

    public synchronized CustomClass getMember() { 
     if (member == null){ 
      member == new CustomClass(); 
     } 
     return member; 
    } 
} 

그런 다음, 당신이 직접 인스턴스화 할 수 있습니다이 생성 된 클래스를 사용하거나 유틸리티 사용하기 :

을 여기 내 말은 무엇
new MyClass_().someMethod(); // prints CustomClass.toString() (non-null) 

또는

Lazy.get(MyClass.class).someMethod() // same 

주석 처리기 및 JCodeModel과 같은 코드 생성기를 사용하여이를 구현하는 것은 매우 간단합니다. 그 주변에 세부 사항이 필요한지 알려주십시오.

관련 문제