Java编程习语:私有实现类

Chi*_*hip 11 java pimpl-idiom private-members private-class

我在一些代码中找到了这个构造.

私有静态类实现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()  {
           ....
        }    
    } 

}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 17

私有静态类实现A有什么好处吗?

好吧,它完全隐藏了实现,所以从封装的角度来看它非常好.我在几次见过的一种情况是自定义比较器.例如:

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>
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

比较器实现类并不需要在外部可见Person,并且能够通过公共静态字段轻松获取实例是很好的.

没有调用者需要知道实现 - 例如,可能只有一个比较器类接受参数 - 他们只是通过常量表达他们想要的比较器.(当然,你可以同样使用枚举.)