java - 如何使用私有(private) Java 类进行有效的 API 设计

标签 java api encapsulation information-hiding

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

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

  • 每个.java 源文件都需要至少1 个public 类才能编译。所以对于我来说,要创建一个 private 类(和非嵌套类),我需要“将它与一个 public 类捆绑在一起。对我来说这只有 如果 public/private 类密切相关。但是如果我的 API 有一部分只包含 private 类怎么办(出于可访问性最小化目的)与任何其他 public 类似物无关?
  • 什么时候使 private 类嵌套,什么时候使它成为非嵌套?或者这只是一个偏好问题?

最佳答案

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

嵌套私有(private)类对于创建非公共(public)类也很有用,它们的范围甚至更窄:它们仅对封闭类可见。

我建议看看 Guava's source code优秀的 API 设计。您会看到各种将内部结构隐藏到外部的技术。

关于java - 如何使用私有(private) Java 类进行有效的 API 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14003074/

相关文章:

Java System.getenv 无法解析 docker-compose 中定义的环境变量

java - 尝试运行 MediaRecorder.start() 方法时出现 "java.lang.RuntimeException: start failed."

java - 关于封装的一个问题

iphone - 封装iAd实现?

java - 如何使用java在mongoDB中保存和读取 map

java - 通过套接字将 Mat 对象从 C++ 发送到 Java

java - Freemarker:迭代哈希中的嵌套列表

javascript - 使用数组内容进行 Json 解码

api - 其他国家的支付系统流程

java - 在另一个类中使用变量