빌더가 자체 클래스 파일 대신 내부 클래스 여야하는 이유는 무엇입니까? 클래스를 만듭니다. 이것은

많은 Builder Pattern예제 Builder가 객체의 내부 클래스를 만듭니다.

이것은 Builder빌드 내용을 나타 내기 때문에 의미가 있습니다. 그러나 정적으로 유형이 지정된 언어에서는 Builder빌드 내용을 알고 있습니다.

(가) 다른 말로하면 Builder내부 클래스, 당신은 해야 (가) 어떤 클래스 알 Builder의 내부를 보지 않고 빌드 Builder.

또한 빌더를 내부 클래스로 사용하면 외부 클래스에서 참조 할 수 있으므로 가져 오기 수가 줄어 듭니다.

그리고 Builder같은 패키지에 있지만 내부 클래스와 같은 실제 예제 는 없습니다 StringBuilder. 당신 은 이름이 지어 졌기 때문에 빌드 Builder 해야한다는 것을 알고 String있습니다.

Builder, 내부 클래스 를 만들기 위해 내가 생각할 수있는 유일한 이유 는 클래스 Builder의 이름을 알지 못하거나 명명 규칙에 의존하지 않고 클래스가 무엇인지 알기 때문입니다. 예를 들어, StringBuilder내부 클래스 String라면 아마도 내가했던 것보다 빨리 존재한다고 생각했을 것입니다 (추론 적).

Builder내적 계급 을 만들 다른 이유가 있습니까? 아니면 선호와 의식으로 귀결됩니까?



답변

나는 이것을하는 이유는 내부 클래스 (빌더)가 자신이 만들고있는 클래스의 개인 멤버에 액세스 할 수 있기 때문이라고 생각합니다.

에서 http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

정적이 아닌 중첩 클래스 (내부 클래스)는 비공개로 선언 된 경우에도 포함 클래스의 다른 멤버에 액세스 할 수 있습니다.

B가 그렇지 않으면 개인으로 선언 된 A의 구성원에 액세스해야하는 두 개의 최상위 클래스 A와 B를 고려하십시오. 클래스 A 내에 클래스 B를 숨기면 A의 구성원을 비공개로 선언하고 B가 액세스 할 수 있습니다.

인스턴스 메서드 및 변수와 마찬가지로 내부 클래스는 해당 클래스의 인스턴스와 연결되며 해당 개체의 메서드 및 필드에 직접 액세스 할 수 있습니다.

다음은이를 설명하기위한 코드입니다.

class Example {

    private int x;

    public int getX() { return this.x; }

    public static class Builder {

        public Example Create() {
            Example instance = new Example();
            instance.x = 5; // Builder can access Example's private member variable
            return instance;
        }
    }
}

정적 클래스로서 Builder에는 묶인 Example의 특정 인스턴스가 없습니다. 그러나 Example 인스턴스 (또는 자체 인스턴스를 생성 한 인스턴스)가 있으면 Builder는 여전히 해당 인스턴스의 프라이빗 멤버에 액세스 할 수 있습니다.


답변

이 경우 “해야한다”는 없습니다. 다른 클래스 내에서 빌더를 정의하거나 분리하는 것은 빌더 패턴과 직교합니다. 많은 예제는 코드를 하나의 일관된 파일로 제공하는 편리 성 때문에 (개인 멤버에 액세스 할 때도 컨텍스트에 따라 다름)이 작업을 수행합니다. 다른 방법으로 자유롭게 느끼십시오