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

时间:2012-12-22 13:05:07

标签: java api encapsulation information-hiding

我正在编写我的第一个“API jar”,它将是开源库并由(可能)其他开发人员使用。我读过Joshua Block's thesis on effective API design,他谈到的一件事 - 我从来没有想到过 - 是他的最小化访问最大化信息隐藏的概念。基本上,您只希望您的API开发人员能够访问他们将使用的Java对象,并且您不希望您的API开发人员能够访问您库中的任何“内脏”。

在我作为Java开发人员的几年中,除了public之外,我从来没有必要创建类。此外,我从未使用过嵌套类。所以我坐在这里想知道如何在我的Java API中实现这种“信息隐藏”最佳实践?我认为私有的,可能是嵌套的类就是答案。但从哪里开始?

  • 每个.java源文件至少需要1个public类才能编译。因此,对于我来创建一个类private(和非嵌套的),我需要“将它与一个public类捆绑在一起。对我而言,只有{em> 才有意义{ {1}} / public类是非常相关的。但是如果我的API的一部分只包含private类(用于可访问性 - 最小化目的)而与任何类无关其他private类似物?
  • 什么时候嵌套public类,什么时候让它非嵌套?或者只是一个偏好的问题?

3 个答案:

答案 0 :(得分:4)

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

嵌套私有类对于创建非公共类也很有用,它们的范围甚至更窄:它们只能由封闭类可见。

我建议您查看Guava's source code以获得出色的API设计。你会看到各种隐藏内部的技术。

答案 1 :(得分:2)

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

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

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

不要害羞地制作可能有意义的public内容,制作真正需要的protected public private ,并且只制作那些可能会因为除了直接相关代码之外的任何东西直接访问而造成伤害的{{1}}内容。

另一个注意事项:隐藏原则的主要目的是简化其他人对代码的使用,并暗示和鼓励正确使用代码。但请记住,文档是实现这一目标的另一个重要手段;无论如何,图书馆都需要文档。 - 如果你有100个公共方法,并且你的文档声明用例需要10个,那么你的lib的用户可能会和他一样好,如果他只能看到那10个那么。

答案 2 :(得分:1)

我确实相信私下。我一直在研究框架类,Joshua正确地告诉你,你应该尽可能地隐藏它。其背后的原因是您将暴露的所有内容都将被使用。一旦使用它,您无法在不破坏客户端代码的情况下进行更改。所有非私人的东西都可以从客户那里获得!基本上你应该使用包私有类,只允许在有用的情况下继承,并且只使那些公开的类是绝对必要的,以使你的lib有用。扩展功能时,“interface segregation principle”是您的朋友。