2017-11-08 12 views
2

저는 롬복을 사용하고 코드를 최소화하려고합니다. 여기에 바닐라 자바 ​​내 (인위적인) 상황입니다 :생성하는 동안 메서드를 실행할 수있는 방법이 있습니까?

public class MyClass { 
    private final int x; 
    private final int sqrt; 
    public MyClass(int x) { 
     this.x = x; 
     sqrt = (int)Math.sqrt(x); 
    } 
    // getters, etc 
} 

는하지만 생성자와 게터 생성 롬복를 사용하려면 : 당신이 인스턴스 고려해 볼 수 있습니다

@Getter 
@RequiredArgsConstructor 
public class MyClass { 
    private final int x; 
    private int sqrt; 
} 

클래스로 계산을 얻으려면을 블록 : 생성자,321 그래서, 실행에

{ 
    sqrt = (int)Math.sqrt(x); 
} 

하지만 인스턴스 블록 전에 코드를 실행 0은 아직 초기화되지 않습니다.

RequiredArgsConstructor에 의해 생성 된 생성자를x이 생성자의 인수로 지정된 후 sqrt = (int)Math.sqrt(x);을 실행,하지만 여전히 사용하는 방법이 있나요?

참고 :

  • 이 게터의 계산을 코딩,
  • 이 예는 실제 클래스의 총 단순화 (하나, 그것은 @Getter을 사용하는 이점을 부정) 옵션을 선택하지 않습니다 final 필드와 계산/파생 필드가 여러 개 있기 때문에 롬 보크를 사용하는 보일러 플레이트 절약이 상당합니다.
  • 클래스는 관리 빈이 아닌 단순 POJO DTO이므로 수명주기 javax 주석 (예 : @PostConstruct)은 없습니다. 모든 사용
+0

@PostConstruct를 사용해 보셨나요? – azurefrog

+1

당신은 https://projectlombok.org/features/GetterLazy를 사용하는 방법에 대해 lombok을 사용하고 있습니까? –

+0

@azurefrog 클래스가 관리 빈이 아니라는 점을 제외하면 좋은 생각입니다. 그것은 단지 POJO입니다. – Bohemian

답변

2

어떻게 계산을위한 lazy option on @Getter 사용에 대한 :

// tested and works OK 
@Getter(lazy = true) 
private final int sqrt = (int) Math.sqrt(x); 

참고 : 직접 그러나 필드에 액세스 예상대로/getSqrt() 작품을 기대 호출 계산을 발사하고 "최종"필드를 설정하지 않는 마법을 부르십시오 - 당신은 초기화되지 않은 값을 얻습니다.

+0

코드는 인라인으로도 될 수 있습니다. 'private final int sqrt = (int) Math.sqrt (x);' 'compute()'메쏘드 – Bohemian

+0

나는 그 것이 더 시원하다는 것을 알지 못했다! –

+0

** final primitive ** https://pastebin.com/5D0tCgaS – Andrew