- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近很沮丧this OP 想根据正在格式化的数字的特征更改输出格式的问题。
自然的机制是动态构造格式,但是因为 PrintStream.format
采用 String
而不是 CharSequence
构造必须结束在 String
的构造中。
构建一个实现 CharSequence
的类会更加自然和高效,该类可以动态提供动态格式,而无需创建另一个 String
。
这似乎是 Java 库中的一个常见主题,默认情况下似乎需要 String
,即使不可变性不是必需的。我知道 Map
和 Set
中的键由于显而易见的原因通常应该是不可变的,但据我所知 String
被使用得很远CharSequence
就足够了。
最佳答案
有几个原因。
在很多情况下,不变性是一项功能要求。例如,您已经确定如果元素或键发生变化,许多集合/集合类型将“中断”。
在很多情况下,不变性是一项安全要求。例如,在沙箱中运行不受信任代码的环境中,任何不受信任代码可以将 StringBuilder
而不是 String
传递给受信任代码的情况都是潜在的安全性问题1。
在很多情况下,原因是向后兼容。 CharSequence
接口(interface)是在 Java 1.4 中引入的。早于 Java 1.4 的 Java API 不使用它。此外,将使用 String
的现有方法更改为使用 CharSequence
存在二进制兼容性问题;即它可以防止旧的 Java 代码在更新的 JVM 上运行。
在其余部分,它可能只是 - “工作太多,时间太少”。对现有标准 API 进行更改需要付出大量努力,以确保每个人都能接受更改(例如检查上述内容),并说服每个人一切都会好起来的。必须优先考虑工作。
因此,尽管您发现这令人沮丧,但这是不可避免的。
1 - 这会给 Java API 设计者留下一个尴尬的选择。他/她是否编写 API 以在传递可变“字符串”时制作(昂贵的)防御性副本,并可能更改 API 的语义(从用户的角度来看!)。或者他/她是否将 API 标记为“对于不受信任的代码不安全”……并希望开发人员注意/理解?
当然,当您出于自己的原因设计自己的 API 时,您可以断言安全性不是问题。 Java API 设计者不在那个位置。他们需要设计适用于所有人的 API。使用 String
是最简单/风险最小的解决方案。
关于java - 为什么这么多 Java 库采用 `String` 而 `CharSequence` 可以呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19748521/
场景 1: 我得到了 Set来自某处,这意味着我无法控制该集合的创建方式。 Set dataSet = GET_DATA_SET(); 我想转换 Set 中的数据至Set 。有没有一种有效的方法可以在
我一直认为 CharSequence[] 和 String[] 本质上是一样的,但是: 我有一些代码具有以下内容: CharSequence[] mEntries; ... String[] mEnt
存在类转换问题。请告诉我如何转换这个。我想要这个 ArrayList在我的 CharSequence[]名为 Contacts . java.lang.ClassCastException (在 An
setText(CharSequence, TextView.BufferType) 和 setText(CharSequence) 有什么区别,什么时候应该使用它们? 最佳答案 setText (C
虽然 String 实现了 CharSequence,但 Java 不允许这样做。做出此设计决定的原因是什么? 最佳答案 之所以禁止这样做是因为它不是类型安全的: public class MyEvi
我无法使用 API 26 更新应用。当我尝试运行项目时出现以下错误 错误: "ServerRunningNotification.java": error: cannot find symbol me
我有一个名为 customObjectList 的自定义对象列表。我想让它绑定(bind)到AlertDialog.Builder.setMultiChoiceItems(),需要先把它转换成Char
public void drawCities(ArrayList cities, Graphics page) { for(int i=0; i(TravelPanel.java:26) at
我需要显示一个对话框,其中包含可供选择的颜色列表。我找到了这个解决方案 here . CharSequence colors[] = new CharSequence[] {"red", "green
如何在Java中将String转换为CharSequence? 最佳答案 由于 String IS-A CharSequence,您可以在需要 的任何地方传递 String CharSequence,
我有一个 Map 并使用 转换为 charsequence[] final CharSequence[] treatmentNameList = treatmentListMap.keySet().t
我定义了以下CharSequence: final CharSequence[] videoQualities = {"any", "medium", "high", "hd"}; 我收到两个字符串值
为什么 String 类中的某些方法具有 CharSequence 类型的参数而其他方法具有 String 类型的参数,是否有逻辑解释? 例如: public String replace(CharS
这将返回一个空指针。 array[0].toString() 也是如此。我做错了什么? final CharSequence[] array = res.getTextArray(R.array.ar
我可以像这样组合两个 CharSequence 变量吗? if (status == 1) { for (int i = 0; i < get.length(); i++) {
有什么方法可以将 CharSequence 转换为 char 数组?为什么接口(interface)没有获取字符数组的方法? 最佳答案 我首先将 CharSequence 转换为 String 然后将
我有一个使用 charseqquence 的简单 Java 代码: static class baloon { CharSequence Titles[]; public
有这个代码: if (cs.equals(keywordUnderProcess)) { } else { } cs 和keywordUnderProcess 都是CharSequence,值为sta
CharSequence[] items = { “Google”, “Apple”, “Microsoft” }; 如果CharSequence是一个接口(interface),那么在上面的例子中我
我正在尝试遍历我的数组列表并打印无效的电子邮件地址。如果地址不包含@符号或句点,则无效。 我收到一个错误,int 无法转换为我的方法的 charsequence。 public static void
我是一名优秀的程序员,十分优秀!