빌더가 자체 클래스 파일 대신 내부 클래스 여야하는 이유는 무엇입니까?


24

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

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

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

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

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

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

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

답변:


30

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

에서 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는 여전히 해당 인스턴스의 프라이빗 멤버에 액세스 할 수 있습니다.


좋은 대답입니다. 그러나 빌더 패턴은 일반적으로 정적 내부 클래스를 가지며 외부 클래스의 정적 개인 멤버에만 액세스 할 수 있습니다. 인스턴스화 된 클래스의 빌더가 모든 종류의 이상한 것입니다.
Nathanial

1
@Nathanial은 아니지만 개인 인스턴스 변수도 액세스 할 수 있습니다. ideone.com/7DyjDR
amon

1
@nathanial : 예, 그러나 빌더는 클래스를 조작하지 않습니다. 빌더 자체가 인스턴스화 한 클래스의 오브젝트를 조작하고 있습니다.
Robert Harvey

@amon 나는 당신이 무엇을했는지 봅니다. 설명 주셔서 감사합니다!
Nathanial

특히 빌더는 빌드중인 클래스의 개인 생성자에 대한 액세스 권한을 빌더에 제공하여 해당 클래스를 변경할 수없고 (모든 필드는 최종) 빌더를 통해서만 인스턴스화 할 수 있습니다.
매튜 맥 피크

1

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


이 답변이 왜 투표에서 내려 진지 확실하지 않습니다. "Java에서 그렇게하지 않기 때문입니다." 빌더 패턴은 많은 매개 변수를 취하는 생성자 주위에 랩퍼를 제공합니다. 생성자가 해당 매개 변수를 사용하면 Builder 오브젝트가 개인용 멤버에 액세스 할 필요가 없습니다.
Greg Burghardt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.