11

いくつかのコードでこの構造を見つけました。

プライベートな静的クラスに 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()  {
           ....
        }    
    } 

}
4

1 に答える 1

17

プライベートな静的クラスに A を実装させるメリットはありますか?

まあ、それは実装を完全に隠しているので、カプセル化の観点からは非常に優れています. これを数回目にした 1 つの状況は、カスタム コンパレータです。例えば:

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。 public static フィールドを介してインスタンスを簡単に取得できると便利です。

呼び出し元が実装を知る必要はありません。たとえば、パラメーターを受け取るコンパレーター クラスが1 つだけ存在する可能性があります。必要なコンパレーターを定数を介して表現するだけです。(もちろん、これには列挙型も同様に使用できます。)

于 2012-08-10T05:52:01.913 に答える