2012-08-10 4 views
11

일부 코드에서이 구문을 발견했습니다.Java 프로그래밍 관용구 : 개인 구현 클래스

개인용 정적 클래스에 A를 구현하면 어떤 이점이 있습니까? 이것은 C++의 Pimpl 관용구를 떠올리게했습니다. Java에서 Pimpl 관용구를 사용하면 어떤 이점이 있습니까?

public abstract class A { 
    public void doStuff(); 

    public static A getNewInstance() { 
     return new AImpl(); 
    } 

    private static class AImpl extends A { 
     public void doStuff() { 
      .... 
     }  
    } 

} 

답변

17

개인 정적 클래스는 구현이 어떤 혜택이 있습니까?

글쎄, 캡슐화의 관점에서 구현이 완전히 숨겨져 있습니다. 몇 번만에 보았던 한 가지 상황은 사용자 지정 비교 자입니다. 예를 들어 :

public class Person 
{ 
    public static final Comparator<Person> NAME_COMPARATOR = new NameComparator(); 
    public static final Comparator<Person> AGE_COMPARATOR = new AgeComparator(); 

    // Name, age etc properties 

    private static class NameComparator implements Comparator<Person> 
    { 
     ... 
    } 

    private static class AgeComparator implements Comparator<Person> 
    { 
     ... 
    } 
} 

Person 외부에서 볼 수있는 비교기 구현 클래스에 대한 실제 필요가없고, 공공 정적 필드를 통해 쉽게 인스턴스를 얻을 수있을 것이 좋다.

호출자는 구현을 알 필요가 없습니다. 예를 들어, 하나의 비교기 클래스가있을 수 있습니다. 예를 들어, 상수를 통해 원하는 비교기를 나타낼 수 있습니다. (물론 enum을 사용할 수도 있습니다.)

+1

답변 해 주셔서 감사합니다. 그러나'NameComparator'와'AgeComparator'를 비공개 클래스로 사용하는 것이 낫지 않습니까? 확실하지 않지만 정적 내부 클래스를 추가하지 않으면 바이너리가 호환되지 않습니까? – Chip

+0

@Chip : 'Person'외부의 비공개 클래스 인 경우 실제로 필요하지 않을 때 같은 패키지에서 계속 사용할 수 있습니다. 정적 인 내부 클래스를 추가하면 명시 적으로 지정하지 않는 한 직렬화 UID가 변경 될 수 있지만 자바의 바이너리 직렬화는 너무 무서워서 어쨌든 사용하지 않습니다. 나는 단순히 코드를 실행하는 바이너리 호환성에 영향을 줄 것이라고는 생각하지 않는다. –

+0

감사합니다. 바이너리 호환성을 해치지 않으면 의미가 있습니다. 디자인이 유연 해지기 위해서는 다른 클래스를 추가하고, 같은 방법으로'AImpl2'를 추가하고, 오래된 클라이언트를 깰 수 있기를 원합니다. – Chip