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()  {
           ....
        }    
    } 

}
乔恩·斯基特(Jon Skeet):

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

比较器实现类实际上不需要在外部可见Person,并且很高兴能够通过公共静态字段轻松获得实例。

没有调用者需要知道实现-例如,只有一个比较器类接受参数-他们只需要通过常量表达他们想要哪个比较器。(当然,您也可以为此使用一个枚举。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用于实现通用接口的2个以上类的高级Java习惯用法

使用pimpl习惯用法时如何创建私有静态const字符串

Pimpl习惯用法的实现取决于模板功能

按需初始化持有人习惯用法-何时加载类?

Java类中除“同步”之外的吸气剂的线程安全习惯用法

是否有用于下垂的python习惯用法?

带有继承的C ++检测习惯用法失败

具有非SAM接口的lambda的Java习惯用法

C ++中等效的有效Java Builder习惯用法?

具有从NameBase类到模板Name类的相关性的C ++习惯用法(或模式)

Haskell模式匹配习惯用法

如何在Python中实现常见的bash习惯用法?

如何最好地在C ++中实现“ newtype”习惯用法?

声明模板类成员和构造函数时的C ++习惯用法

在 std::vector 中存储使用 PIMPL 习惯用法的类

使用PIMPL习惯用法为可复制的类编写可复制的unique_ptr

在Objective-C中使用C ++类-为什么要使用PImpl习惯用法?

C#中创建“案例类”的最佳实践/习惯用法

PIMPL习惯用法,用于指向C ++中的类的指针

模板实例化和带有 unique_ptr 的 pimpl 习惯用法

初始化按需持有人习惯用法

使用PIMPL习惯用法时,有什么方法可以限制重复样板?

是否有用于在文件路径中添加斜杠的习惯用法?

正确实施按需初始化持有人习惯用法

是否有JavaScript习惯用法将“未定义”更改为“空”?

Rust是否具有等同于F#typedef的习惯用法?

有关F#习惯用法和样式的反馈;做什么;卑鄙等

与Java静态块等效的C ++习惯用法是什么?

Java异常处理习惯用法...谁是正确的,以及如何处理?