如何使用私有Java类进行有效的API设计

如何使用私有Java类进行有效的API设计,java,api,encapsulation,information-hiding,Java,Api,Encapsulation,Information Hiding,我正在编写我的第一个“API jar”,它将是开放源代码库,并且(可能)被其他开发人员使用。我读过,他谈到的一件事——我从来没有想到过别的——是他关于最小化访问和最大化信息隐藏的概念。基本上,您只希望API开发人员能够访问他们将要使用的Java对象,而不希望API开发人员能够访问库中的任何“内脏” 在我作为Java开发人员的几年中,我从来没有需要将类设置为除公共之外的任何东西。此外,我也从未使用过嵌套类。所以我坐在这里想知道如何在我的JavaAPI中实现这种“信息隐藏”的最佳实践?我认为私有的,

我正在编写我的第一个“API jar”,它将是开放源代码库,并且(可能)被其他开发人员使用。我读过,他谈到的一件事——我从来没有想到过别的——是他关于最小化访问和最大化信息隐藏的概念。基本上,您只希望API开发人员能够访问他们将要使用的Java对象,而不希望API开发人员能够访问库中的任何“内脏”

在我作为Java开发人员的几年中,我从来没有需要将类设置为除
公共
之外的任何东西。此外,我也从未使用过嵌套类。所以我坐在这里想知道如何在我的JavaAPI中实现这种“信息隐藏”的最佳实践?我认为私有的,可能是嵌套的类就是答案。但是从哪里开始呢

  • 每个
    .java
    源文件至少需要1个
    public
    类才能编译。因此,对于我来说,要创建一个类
    private
    (并且是非嵌套的),我需要“将它与
    public
    类捆绑在一起”。对我来说,这只有在
    public
    /
    private
    类之间有很大的关联时才有意义。但是,如果我的API中有一个部分只包含
    private
    类,那该怎么办呢(为了使可访问性最小化)与任何其他
    公共
    类似物无关
  • 什么时候嵌套一个
    private
    类,什么时候非嵌套类?还是只是偏好的问题

包私有类(即没有任何可见性修饰符)仅对同一包的类可见。这是一种使API的其他几个类可见,但对外部世界不可见的方法

嵌套的私有类对于创建非公共类也很有用,它们的作用域甚至更窄:它们仅由封闭类可见


我建议你看看一个优秀的API设计。你会看到各种各样的技术将内部隐藏到外面。

就我个人而言,我不相信
private
。我在可行的情况下使用
protected
,以实现OO设计的一些主要好处

基本上,“信息隐藏”原则作为一个指导原则是不错的。但是,在实践中,人们不应该在所有情况下都盲目遵循它。-对于纯原则,正如其他人所建议的,您需要将一组接口定义为公共接口,并用包私有类、工厂方法等隐藏库的所有其余部分。给出n Java的包私有可见性存在一些问题,使得它在许多情况下有些无用(-lib中的类将希望跨包协作),这反过来似乎阻止了这种方法

此外,API至少有两种类型的用户:基本用户(将使用您提供的对象和方法)和具有复杂需求的用户(至少),他们希望通过继承来修改API的行为,而许多“隐藏”的东西将成功地阻止这种行为

不要羞于将那些有意义的东西
公开
,将那些实际上不需要公开的东西
保护
,并且只将那些如果直接被除直接相关代码以外的任何东西访问而可能造成伤害的东西
私有


另一个注意事项:隐藏原则的一个主要目的是简化他人对代码的使用,并暗示和鼓励正确使用代码。但请记住,文档是实现这一点的另一个重要手段;无论如何,库都需要文档。-如果您有100个公共方法,并且您的文档说明了10个这些都是用例所需要的,如果你的库的用户只看到这10个,他可能会很好地处理这些问题。

我确实相信隐私。我已经在框架类上工作了很长时间,Joshua告诉你应该尽可能多地隐藏。这背后的原因是您公开的所有内容都将被使用。一旦被使用,您就无法在不破坏客户端代码的情况下对其进行更改。所有非私有的内容都可以从客户端访问!基本上,您应该使用包私有类,只允许继承有用的内容,并且只公开那些使lib有用的绝对必要的类。在扩展功能时,“”是您的朋友。

您可以在接口中发布API,并使所有实现包成为本地包。此外,Java源文件不需要公共类:您的类可以是本地包。您可以声明
类XX{}在XX.java中,这意味着XX只能从同一个PACKAGE访问。对于嵌套类,您也应该考虑何时使用非静态嵌套类(内部类)。以及何时使用静态嵌套类。您可能喜欢阅读这个SOF问题:…我使用框架已经足够长的时间了,几乎在每一个框架中都看到了严重缺陷的可视性使用。我认为如果“您公开的所有内容都将被使用”,这并不是一件坏事".当然,如果你宣布所有内容都是私有的,你可以随时自由更改所有内容。但对我来说,这有点太白纸黑字了。让用户使用你编写的代码吧!-否则,他们会继续重新发明轮子,或者派生出自己的源代码版本,从而消除更新的可能性后来。事实上,当所有被公开的东西都被使用时,没有什么不好的!我只是说:只公开你想使用的东西。否则用户会看到他们的代码停止工作,因为一些公共的“内部”在lib中,更改了。另请参见open-closed原则:lib应该为修改而关闭,但为扩展而打开