为什么android.os.Bundle是一个final类?

5

最近我遇到了一些与android.os.Bundle相关的问题,我希望通过扩展该类并使其更加松散类型来解决。 我遇到的具体问题是出现以下错误:

W/Bundle  ( 6782): Key access_token expected byte[] but value was a java.lang.String.  The default value <null> was returned.
W/Bundle  ( 6782): Attempt to cast generated internal exception:
W/Bundle  ( 6782): java.lang.ClassCastException: java.lang.String
W/Bundle  ( 6782):  at android.os.Bundle.getByteArray(Bundle.java:1305)

当然,将String转换为byte[]是微不足道的,所以我的想法是,如果Bundle正在寻找一个byte[]但实际上找到了一个String,那么让Bundle自动执行此转换。在我看来,它不仅愚蠢,而且还有特定的getter和setter用于几乎每个基本类型和一些不同的Object类型,而不是使用可以直接使用Object或最坏的情况下使用NumberStringParcelable的通用类型。

但是,我很快发现无法通过扩展Bundle来解决这个问题,因为它被声明为final。这是有任何已知/具体原因吗?在android.os中还有其他未被声明为final的类,那么是什么使Bundle值得被分配为final

此外,有什么解决方法吗?封装类不行,因为它没有共同的interface需要实现(实际引起问题的代码是第三方库的一部分,所以我不能直接更新它来引用封装类)。

我想这只留下了一种选择,那就是找到代码中所有设置String值的地方,以便第三方代码期望将其作为字节数组传递。


2
可能出于同样的原因,日志被声明为 final:为了惹恼你。 - ahodder
在C#世界中,从字符串到字节数组的转换是微不足道的,但并不明显(即Convert.FromBase64String或Encoding.Utf8.GetBytes或其他编码)。Java是否有官方的字符串->字节数组转换? - Alexei Levenkov
@Alexei Levenkov - 是的,Java有String.getBytes() - aroth
3
我不确定你是否会得到一个令你满意的答案。你的论点似乎是(我碰巧也同意),final 只是一个烦人且无必要机制,它没有任何作用,只会通过引入其他开发人员对于什么应该或不应该完成的假设来妨碍开发人员。但我可以想到的每个 final 类都是如此,除了程序员的傲慢以外,从来没有任何有用的理由。我怀疑 Bundle 也不会例外。 - Yevgeny Simkin
3个回答

2

基本上所有的"原始类型"都是final的。这样做有几个原因。首先,Bundle旨在可以被序列化,如果您覆盖它,可能会破坏其语义。此外,Bundle旨在始终按某种方式执行。如果您覆盖它,可能会改变人们预期的行为,甚至会抛出异常并破坏之前被认为是安全的代码。还可以争论这可能是一种安全漏洞,因为他们可以使用代码覆盖它来跟踪发生了什么。


1

这个类是final的,因为你不应该需要继承它。文档 显示有大量的方法可以用于获取和放置各种类型。如果你真的关心将一个 String 转换成 byte[],那么你要找的是一个Java方法(点击我),而不是Android特有的东西。


0
如果您想将一个字符串转换为字节数组,并且不想在Bundle之外处理该操作,您该如何做呢?
Bundle.putByteArray(String string) <<== ??

你已经有了存储ByteArray的putByteArray()和存储字符串的putString(),正如你所说,转换是微不足道的,所以如果你需要将字符串作为字节数组,请在将其放入bundle之前进行转换,并在提取它时进行转换回来。

至于为什么类是final的,你已经确定它处理了“几乎每个基本类型和一些不同的Object类型”,那为什么要用不必要的东西把类弄得臃肿呢?方便是一回事,冗余是另一回事...


1
什么?声明类为“final”如何减少冗余代码?对于一个预计将被数十万甚至数百万开发人员使用的SDK中的类,我希望SDK架构师非常不愿意使任何类成为final,因为很难预测所有这些开发人员可能想要做的事情。 - aroth
让我们记住...我们正在谈论Bundle,这是一个字典类型的类,旨在简单地打包数据以进行传输。确实很难预测那些数百万开发人员可能想要做的所有事情,但我可以想象他们大部分的精力都花在了尝试预测那些数百万开发人员可能需要做的所有事情上。如果这对你来说真的很重要,我建议你提交SDK更改请求。 - Neil T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接