【问题标题】:Why are some classes not public in the Android Support Library?为什么有些类在 Android 支持库中不公开?
【发布时间】:2015-06-26 22:43:54
【问题描述】:

为什么 Android 库中包含的某些类不公开?对我来说,这没有任何意义,基本上只是为开发临时修复最近发布的一些漏洞百出的小部件引入了障碍。

具体来说,我说的是Android Design Support Library 中的TextInputLayout。 例如,如果我想创建一个自定义小部件来覆盖构造函数中的一些代码,我不能这样做,因为CollapsingTextHelper 不是公共类。我必须下载源代码并将相关的类复制到我的项目中,但实际上并没有任何东西阻止我这样做。那么一开始不公开又有什么意义呢?

据我了解,随着时间的推移,库会不断更新和改进,您只需添加 @Deprecated 注释即可指示特定类已过时或已过时,并且仍然存在以防止遗留代码中断。
我知道图书馆简单地将所有类公开是没有意义的,但我不明白为什么对小部件的实现至关重要的类不应该公开。当其中一个类被更好的版本替换时,或者当小部件以完全不同的方式实现时,他们为什么不能只添加 @Deprecated 注释?

【问题讨论】:

  • 你能说得更具体点吗?这可以广义地解释为询问 OO 封装的优点是什么。
  • 您是否正在尝试制作自定义小部件,但您不想从 android 小部件类扩展? (你不小心写了超类,它应该是子类)。为什么你不想从小部件类扩展?有什么原因吗?
  • 我编辑了我的问题,希望能弄清楚我真正问的是什么。如果它仍然令人困惑或不清楚,那么也许我的问题真的很愚蠢。但至少我会知道你为什么知道
  • 这不仅仅是一个被弃用的类。如果小部件的内部工作不公开,Google 可以完全更改实现,而无需将类标记为已弃用。他们可以删除和添加类并更改有关它们的所有内容,而不必担心保持向后兼容性。如果第三方开发人员想要使用一些非公共类,他无论如何都可以很容易地做到这一点。在 Android Studio 或 IntelliJ 中可以一键/热键查看支持库的源代码并将其复制到自己的项目中。
  • @Xaver 非常感谢。

标签: java android android-support-library android-design-library


【解决方案1】:

简而言之 - 通过将这些类设为非公开,他们保留在不破坏任何客户(您的)代码的情况下随时更改/删除该类的权利。

看看已经有多少@Deprecated 方法/类,你就会明白为什么这很重要。

【讨论】:

  • 我编辑了我的帖子并对此做出了回应。你能告诉我你的想法吗?
  • @Solarnum 弃用的问题是,即使您可以将类注释为 Deprecated 并从头开始编写新的,您仍然支持旧版本,因为遗留代码仍将依赖它。当然,这不是你做不到的。但是如果你一遍又一遍地重复这个过程,你的代码库就会变得一团糟。非公共类(特别是包私有类)的另一个原因是它们通常包含一些棘手的逻辑,需要深入了解底层框架(也可以更改)——对于 UI 尤其如此
  • 完美。非常感谢!
  • @Solarnum Xaver Kapeller 对您的问题的评论也非常好。考虑阅读它
  • 我以前从未真正考虑过它,因为我个人遇到过非公共类(TextInputLayout 除外)的唯一一次是在 android 中使用系统级类,而我没有再考虑一下,因为它们无法访问是有道理的。
【解决方案2】:

一旦你将一个公共类添加到你的库中,你基本上必须维护它。您不能简单地删除它,因为这将是一个重大更改。因此,您只能将其标记为 @Deprecated 并继续维护它,远远超过您实际使用它的时间。


不仅仅是一个类被弃用。主要是说API和实现细节的区别。

如果小部件的内部工作不公开,Google 可以完全更改实现,而无需将这些类中的任何一个标记为已弃用。从长远来看,这具有多重优势。

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

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

  • Mac: + B
  • Windows:Ctrl + B

从那里开始,将相关类复制到您的项目、修改它们并按照您的喜好使用它们非常简单。


只要说在 99% 的情况下您都不需要这样做就足够了。 Google 确实考虑过哪些类应该是公共的,因此是 API 的一部分,哪些只是小部件实现的一部分。

【讨论】:

  • 您也可以 ⌘+单击类名,它会将您带到源文档。谢谢!我想我只是在想的是,与其将类设为非公开,不如只使用 @Unsupported 之类的注释,但这是一个非常小众的用例,需要通过简单的手动工作来广泛使用哈哈.....所以一切都是有道理的。
【解决方案3】:

出于同样的原因,java 中的每个其他类/字段/变量(不仅如此)都有访问修饰符。

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

它可能是为了增强或帮助图书馆的深奥功能。

如需具体答案,请缩小您的问题范围。您想使用哪个不公开的课程,而您认为应该公开?

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 1970-01-01
    • 2018-04-11
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多