当前位置: 首页 > 知识库问答 >
问题:

为什么要隐藏类实现?

戚英逸
2023-03-14

我被这个概念困住了。

这是我在一个站点上看到的解释的一部分:

隐藏实现

我是这样想象的:

public void print(String message)
{
     System.out.println(message);
}

库客户机是否知道这个实现有什么区别?

共有1个答案

终波涛
2023-03-14

实现并不是真的隐藏在视野之外。尤其是因为您将要使用的大多数库都是开源的。在本例中,“hidden”指的是不属于公共API的任何内容。库的公共API由库公开的公共方法和字段组成。一旦库发布了一个版本,它应该继续支持未来版本上的公共API。任何其他东西都被认为是隐藏的,并且该库的用户不能依赖该库的未来版本中存在的“隐藏代码”。

编辑:

但是,例如,如果代码不是隐藏的,客户机怎么可能依赖它呢?

public void doSomething(CharSequence x);

这是经常出现的,有很多方法可以绕过它。例如,当log4j升级到第2版时,它们的变化非常剧烈,以至于它们的API不得不中断,因此创建了一个称为log4j2的全新库。因此它是一个完全不同的库,包名不同。它不是旧图书馆的新版本,它是一个名称相似的新图书馆。

与此形成对比的是,看看Java SE的hashtable类。这是不应该再使用的旧类。但是Java有一个严格的规则,新版本中必须仍然支持以前版本的旧公共API。因此Java无法做到log4j所做的事情。

再比如Spring。Spring尝试遵循Java所做的方法,您只需要更新版本,旧代码就可以工作了。但Spring确实不推荐使用它的部分公共API。它将删除旧的类和方法,这些类和方法是公共的,但它真的不希望人们再使用它们。在这种情况下,我作为Spring的用户可能会发现很难从版本1升级到版本4。主要是因为某些公共API可能已被弃用。

因此,这里我给出了三种不同的图书馆作者解决这种情况的方法。

1)Side steps旧版本并创建一个全新的库。例如log4j。2)严格并始终支持旧的公共AIP。例如Java。
3)缓慢地不推荐旧的公共APIhtml" target="_blank">方法或类。例如Spring。

作为这些库的用户,我希望旧的公共API得到支持。这三个例子我都用过。我不得不在遗留代码上使用旧的hashtable类,我正在升级到Java8,很高兴它仍然受到支持。我已经感受到了从log4j1升级到log4j2的痛苦。我还在一个复杂的项目上升级了Spring,并产生了需要排除故障的不利影响。我可以告诉您,严格遵守旧的公共API对于所述库的用户来说是最容易的。

 类似资料:
  • 我理解不同的行为(与覆盖相比是新的),但不理解术语。

  • 我没有受过CS方面的教育,但我已经专业地用Java编程近十年了,我从未见过任何人在生产系统中实现。这并不意味着它没有它的用途,或者和我一起工作的人一直在做正确的事情。 所以我的问题是,有哪些实现的用例不能通过语言中的另一个进程或语法更可靠地处理? 请提供具体的场景或您的经验,简单地重复一本Java教科书,或者Finalize的预期用途是不够的,因为这不是本问题的意图。

  • 问题内容: 问题很简单而且简短:为什么要清除浮动?我查看了w3标准文档,但没有任何暗示。 问题答案: 因为当您与其他任何东西一起使用时会建立一个新的块格式设置上下文(链接到w3.org规范)。

  • 我在Hibernate验证器和JSF中遇到了一些令人惊讶的行为。我想知道这种行为是一种错误,还是我对自己期望的一种误解。 我有这个Facelets页面: 如果在中运行方法,则验证器将始终返回验证错误(消息“可能不是空的”),因为始终为空。这种行为在我看来是正确的。 如果以空白值提交表单,则会收到“可能不为空”的错误消息;如果您输入了一个值,它将通过验证,但您将在控制台中看到的值仍然为NULL。这种

  • 问题内容: 我已经阅读了许多关于Java的新手问题,发现令人困惑的是,没有人真的说过是清理资源的不可靠方法。我看到有人评论说他们用它来清理,这确实很吓人,因为要保证关闭的唯一方法就是最终实现。 我没有在CS上学,但是近十年来我一直在用Java专业编程,而且从未见过有人在生产系统中实现过。这仍然并不意味着它没有用途,或者与我一起工作的人都在正确地做它。 所以我的问题是,存在哪些用例无法通过语言中的其

  • 问题内容: 我无法理解如何正确确保在这种情况下不存在某些问题: 我发现检查该值是否实际的唯一方法是使用反射。 这真的是想要的行为吗?还是在代码中看不到一些重大错误? 在此处播放链接 问题答案: 这里的问题是那是一种类型。Go中的接口类型保存实际值及其 动态 类型。关于此的更多详细信息:反射定律#接口的表示。 您返回的切片包含2个非值。第二个值是一个接口值,一个保存指针值的(值;类型)对和一个具体类