[英]How to use private Java classes for effective API design
我正在编写我的第一个“API jar”,它将是开源库并由(可能)其他开发人员使用。 我已经阅读了Joshua Block关于有效API设计的论文 ,他谈到的一件事 - 我从来没有想到过 - 是他最小化访问和最大化信息隐藏的概念。 基本上,您只希望您的API开发人员能够访问他们将使用的Java对象,并且您不希望您的API开发人员能够访问您库中的任何“内脏”。
在我作为Java开发人员的几年中,我从来没有必要创建除了public
之外的任何类。 此外,我从未使用过嵌套类。 所以我坐在这里想知道如何在我的Java API中实现这种“信息隐藏”最佳实践? 我认为私有的,可能是嵌套的类是答案。 但从哪里开始?
.java
源文件都需要至少一个public
类来编译。 因此,对于我来说private
(和非嵌套)类,我需要“将它与public
类捆绑在一起。对我来说,这只有在public
/ private
类密切相关时才有意义。但是,如果我有一个部分我的API只包含与任何其他public
类比无关的private
类(用于可访问性最小化目的)? private
类,什么时候让它嵌套? 或者只是一个偏好问题? 就个人而言,我不相信private
。 在可行的情况下,我使用protected
以允许OO设计的一些主要好处。
基本上,“信息隐藏”原则并不是一个指南。 但是,在实践中,不应该在所有情况下盲目地遵循它。 - 对于纯粹的原则,正如其他人所建议的那样,你需要将一组接口定义为公共接口,并使用包私有类,工厂方法等隐藏所有其余的lib。 鉴于Java的包 - 私有可见性存在一些问题,在许多情况下(在您的lib中的类将希望跨包合作 - )这有点无用,这反过来似乎阻止了这种方法。
此外,API总是至少有两种类型的用户:基本用户,谁将使用您提供的对象和方法,以及具有复杂需求的用户,他们希望通过继承来修改API的行为(至少) ,很多'隐藏'的东西会成功阻止。
不要害羞地把这些东西public
,这些东西可能是有意义的, protected
那些并非真正需要public
东西,并且只有那些可能造成伤害的private
东西如果直接被除了直接相关的代码之外的任何东西访问。
另一个注意事项:隐藏原则的主要目的是简化其他人对代码的使用,并暗示和鼓励正确使用代码。 但请记住, 文档是实现这一目标的另一个重要手段; 无论如何,图书馆都需要文档。 - 如果您有100个公共方法,并且您的文档说明用例需要10个这样的用户,那么您的lib的用户可能会与他一样好,如果他只能看到那10个那么。
我确实相信私人。 我一直在研究框架类,Joshua正确地告诉你,你应该尽可能地隐藏它。 其背后的原因是您将暴露的所有内容都将被使用。 一旦使用它,您无法在不破坏客户端代码的情况下进行更改。 所有非私人的东西都可以从客户那里获得! 基本上你应该使用包私有类,只允许在有用的情况下继承,并且只使那些公开的类是绝对必要的,以使你的lib有用。 在扩展功能时,“ 界面隔离原则 ”是您的朋友。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.