Java 为什么有些类在Android支持库中不是公共的?

Java 为什么有些类在Android支持库中不是公共的?,java,android,android-support-library,android-design-library,Java,Android,Android Support Library,Android Design Library,为什么Android库中包含的一些类不是公共的?对我来说,这没有什么真正的意义,基本上只是给最近发布的一些错误百出的小部件开发临时修复带来了障碍 具体来说,我指的是中的TextInputLayout。 例如,如果我想制作一个覆盖构造函数中某些代码的自定义小部件,我就不能这样做,因为collasingTextHelper不是公共类。我必须下载源代码并将相关类复制到我的项目中,但实际上没有任何东西阻止我这样做。那么一开始不公开有什么意义呢 据我所知,随着库的不断更新和改进,您只需添加@Depreca

为什么Android库中包含的一些类不是公共的?对我来说,这没有什么真正的意义,基本上只是给最近发布的一些错误百出的小部件开发临时修复带来了障碍

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

据我所知,随着库的不断更新和改进,您只需添加
@Deprecated
注释,以指示某个特定类已过时或过时,并且仅为防止遗留代码中断而保留该类。

我知道库简单地将所有类公开是没有意义的,但我不理解为什么实现小部件所必需的类不应该公开。当一个类被一个更好的版本替换时,或者当小部件以一种完全不同的方式实现时,他们为什么不能添加
@Deprecated
注释呢?

简而言之,通过使这些类非公共化,他们保留了随时更改/删除此类的权利,而不会破坏任何客户端(您的客户端)代码


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

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

如果它不是公共的,您就不能使用它(根据上下文,相同的规则适用于其他修饰符;封装等)

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


对于一个具体的答案,请让你的问题不那么宽泛。您想使用哪个类不是公共的,并且您认为它应该是公共的?

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


但是这不仅仅是一个类被弃用的问题。我主要讨论API和实现细节之间的区别

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

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

在Android Studio或IntelliJ中,只需右键单击类并选择
“转到”->“声明”
或使用以下快捷方式,即可查看支持库的源代码:

  • Mac:⌘ + B
  • Windows:Ctrl+B
从那时起,将相关的类复制到项目中,修改它们并使用它们是非常简单的



可以说,在99%的情况下,你无论如何都不需要这样做。谷歌肯定在哪些类应该是公共的、因此是API的一部分、哪些只是小部件实现的一部分上花了很多心思。

你能更具体一点吗?这可以被广义地解释为询问OO封装的优势是什么。您是否试图制作一个自定义小部件,但不想从android小部件类扩展?(您意外地编写了超级类,它应该是子类)。为什么不想从widget类扩展?有什么原因吗?我编辑了我的问题,希望能澄清我真正的问题。如果它仍然令人困惑或不清楚,那么也许我的问题真的很愚蠢。但至少我知道你为什么知道这不仅仅是一个类被弃用的问题。如果小部件的内部工作不是公开的,Google可以完全更改实现,而不必将类标记为已弃用。他们可以删除和添加类,并更改关于它们的所有内容,而不必担心维护向后兼容性。如果第三方开发人员想要使用一些非公共类,他无论如何都可以很容易地做到这一点。在Android Studio或IntelliJ中,您可以通过单击/热键查看支持库的源代码,并将其复制到您自己的项目中。@X非常感谢。我编辑了我的文章,并给出了我对此的回复。您能告诉我您的想法吗?@Solarnum不推荐的问题是,即使您可以将类注释为
Deprecated
,然后从头开始编写新的类,您仍然必须支持旧版本,因为遗留代码仍然依赖于它。当然,这不是你不能做的事。但是如果你一遍又一遍地重复这个过程,你的代码库就会变得一团糟。非公共类(特别是包私有类)的另一个原因是,它们通常包含一些复杂的逻辑,这需要对底层框架有深入的了解(也可能发生变化)——这对于UIPerfect尤其如此。非常感谢@Xaver Kapeller对Solarnum问题的评论也很好。考虑阅读ITI以前从来没有真正想过这一点,因为我曾经亲身遇到的非公共类(除了TeXTItPayDead)的时候,在Android中已经有了系统级的类,我没有再考虑它,因为它是有意义的,它们是不可访问的。⌘+C