为什么Android的图书馆中包含的某些课程不公开?对我来说,这没有任何实际意义,基本上只是为最近发布的一些错误的小部件开发临时修复程序的障碍。
具体来说,我正在谈论Android Design Support Library中的TextInputLayout
。
例如,如果我想创建一个自定义窗口小部件来覆盖构造函数中的某些代码,我无法做到这一点,因为CollapsingTextHelper
不是公共类。我必须下载源代码并将相关的类复制到我的项目中,但实际上并没有任何阻止我这样做的事情。那么首先不公开的重点是什么呢?
据我了解,随着时间的推移,库会得到更新和改进,您只需添加@Deprecated
注释即可指示特定类是旧的还是过时的,并且只是为了防止遗留代码中断。登记/>
我知道图书馆简单地公开所有课程是没有意义的,但我不明白为什么对小部件实施至关重要的课程不应公开。当其中一个类被更好的版本替换时,或者当小部件以不同的方式实现时,为什么他们只能添加@Deprecated
注释?
答案 0 :(得分:7)
简而言之 - 通过让这些课程非公开,他们可以随时保留更改/删除此课程的权利,而不会破坏任何客户的代码。
看看已经有多少@Deprecated
种方法/类,你就会明白为什么这很重要。
答案 1 :(得分:3)
一旦将公共类添加到库中,您基本上必须维护它。你不能简单地删除它,因为这将是一个突破性的变化。因此,您只能将其标记为@Deprecated
并继续维护它的时间远远超过您实际使用它的时间。
但它不仅仅是一个被弃用的课程。主要是我在谈论API和实现细节之间的区别。
如果窗口小部件的内部工作方式不公开,Google可以完全更改实现,而不必将这些类标记为已弃用。从长远来看,这具有多重优势。
他们可以删除和添加类并更改有关它们的所有内容,而无需担心保持向后兼容性。如果第三方开发人员想要使用一些非公开课程,他或她可以很容易地做到这一点。
在Android Studio或IntelliJ中,您只需右键单击该类并选择"Go to" -> "Declaration"
或使用以下快捷方式即可查看支持库的源代码:
从那时起,将相关类复制到项目中,修改它们并随意使用它们非常简单。
我只想说在99%的情况下,你无论如何都不需要这样做。 Google肯定会考虑哪些类应该公开,因此是API的一部分,而这只是小部件实现的一部分。
答案 2 :(得分:1)
出于同样的原因,java中的每个其他类/字段/变量(而不仅仅是)都有访问修饰符。
如果它不公开,则不打算使用它(相同的规则适用于其他修饰符,具体取决于上下文;封装等)。
这可能是为了增强或帮助图书馆的深奥功能。
如需特定答案,请将您的问题扩大。你想使用哪个课程并不公开,你认为它应该是?