2014-09-19 5 views
5

나는 자바 8 빌더 표기법을 잘 알고 있지만 자바 8에서는 사용되지 않으며 큰 코드베이스에서 기존 코드를 대체해야한다. 비슷한 프로그래밍 스타일을 유지하고 싶습니다. 이제 이중 중괄호 초기화를 사용할 수 있지만 익명의 내부 클래스를 너무 많이 생성하는 것을 좋아하지 않으며 때때로 특정 클래스에 문제가 발생할 수 있다는 것을 알았습니다. 비슷한 것을 이루기 위해 람다 (lambda)를 사용하는 방법이 있어야한다고 생각하고 이것을 생각해 내었습니다.자바 람다를 사용하여 javafx 빌더 대체하기

public class FXUtil { 
    public static <T> T build(T node, Consumer<T> initializer) { 
    initializer.accept(node); 
    return node; 
    } 
} 

그래서 지금은이 빌더 또는 이중 중괄호 구문 것만 큼 좋은하지 않습니다 그래서

Label label = FXUtil.build(new Label(), label -> { 
    label.setText("Text"); 
    label.setStyle("-fx-font-size: 20"); 
    label.setMinWidth(100); 
}); 

처럼 내 빌더를 대체하지만, 아무것도보다 더 할 수 있습니다. 내 질문은 이중 중괄호 초기화와 비슷한 단점이 있습니까? 객체 자체는 익명 클래스가 아니지만 본질적으로 람다에 대한 익명 클래스를 만들어 동일한 작업을 수행하고 있습니까? 람다는 쓰레기 수거를해야합니다, 맞습니까? JDK8에서 permgen 공간이 사라 졌으므로 걱정할 필요가 있습니까? 다른 사람이 FXML을 사용하는 것 외에 javafx 클래스를 초기화하는 더 좋은 방법이 있습니까?

편집 : @BenjaminGale

난 당신이 이중 중괄호 초기화로 참조하고있는 단점을 가정
+2

'initializer.apply (node)'라고해야할까요? 'constructor'이란 무엇입니까? –

+3

나는 그것을 얻지 않는다. 왜 그렇게 복잡하게 만드나요? 단순히'Label label = new Label();', 그 다음에'label.set ... (...);'문장이 뒤따라야하는 이유는 무엇입니까? 그것은 여전히 ​​더 짧고 익명의 내부 클래스 나 람다 식을 필요로하지 않습니다. – Holger

+0

@Holger 주요 이점은 객체 생성과 초기화가 하나의 명령문에서 발생한다는 것입니다. 이렇게하면 리팩터링하는 동안 실수로 객체를 초기화하지 않고 객체의 속성을 즉시 확인할 수 있으므로 코드 유지 관리가 쉬워집니다. 다른 이점은 객체를 인라인으로 지정할 수 있으므로 이와 같은 선언적 프로그래밍 스타일을 더 많이 가질 수 있다는 것입니다. 새로운 VBox ( FXUtils.build (new Label(), label -> label.setStyleClass ("title")), FXUtils.build (new TextBox(), text -> text.setStyleClass ("input")) ); –

답변

3

에서 제안에 업데이트 된 예는 내부 클래스로서 그것을가 생성 된 바깥 클래스에 대한 참조를 캡처하는 것입니다. 람다는 그렇게하지 않을 것입니다. (그리고 Oracle Hotspot JVM에서는 익명의 내부 클래스로 컴파일되지 않습니다.)

관련 문제