为什么在 Android 支持库中有些 类 不是 public?

Why are some classes not public in the Android Support Library?

为什么 class 中的一些 class 没有包含在 Android 的库中?对我来说,这没有任何实际意义,基本上只是引入了一个障碍,无法为最近发布的一些漏洞百出的小部件开发临时修复程序。

具体来说,我说的是 Android Design Support Library 中的 TextInputLayout。 例如,如果我想制作一个覆盖构造函数中某些代码的自定义小部件,我不能这样做,因为 CollapsingTextHelper 不是 public class。我将不得不下载源代码并将相关的 classes 复制到我的项目中,但实际上并没有什么可以阻止我这样做。那么一开始就没有做到 public 有什么意义呢?

据我了解,随着库的不断更新和改进,您只需添加 @Deprecated 注释即可表明特定的 class 已过时或已过时,并且仍然存在以防止遗留代码被破坏。
我知道对于一个库来说,简单地使所有 classes public 是没有意义的,但我不明白为什么 classes 不应该是实现小部件所必需的public。当 class 中的一个被更好的版本替换时,或者当小部件以完全不同的方式实现时,为什么他们不能添加 @Deprecated 注释?

简而言之 - 通过使那些 class 非 public 他们保留在任何时候 change/delete 这个 class 的权利,而不会破坏任何客户的 (你的)代码。

看看已经有多少 @Deprecated methods/classes,您就会明白为什么这很重要。

出于同样的原因,java 中的每个其他 class/field/variable(而且不仅如此)都有访问修饰符。

如果不是 public,则您不打算使用它(相同的规则适用于其他修饰符,具体取决于上下文;封装等)。

它的存在可能是为了增强或帮助图书馆的神秘功能。

要获得具体答案,请降低您的问题的范围。您想要使用哪个 class 而不是 public 而您认为它应该是?

将 public class 添加到您的图书馆后,您基本上必须维护它。您不能简单地删除它,因为那将是一个重大更改。因此,您只能将其标记为 @Deprecated 并继续维护它的时间远远超过您实际使用它的时间。


但是 不仅仅是 class 被弃用。我主要说的是API和实现细节的区别

如果小部件的内部工作方式不是 public Google 可以完全更改实现,而不必将这些 class 中的任何一个标记为已弃用。这在长 运行.

中有多个优点

他们可以删除和添加 classes 并更改关于他们的一切,而不必担心保持向后兼容性。如果第三方开发人员想要使用一些非 public classes,他或她无论如何都可以很容易地做到这一点。

在 Android Studio 或 IntelliJ 中,您可以通过右键单击 class 并选择 "Go to" -> "Declaration" 或使用以下快捷方式来查看支持库的源代码:

  • Mac: + B
  • Windows: Ctrl + B

从那时起,将相关的 classes 复制到您的项目、修改它们并根据需要使用它们非常简单。


我只想说,在 99% 的所有情况下,您都不需要这样做。 Google 肯定花了很多心思 classes 应该是 public 结果是 API 的一部分并且只是小部件实现的一部分.