首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Java字符串没有静态字符串操作方法?

为什么Java字符串没有静态字符串操作方法?
EN

Software Engineering用户
提问于 2013-12-12 06:02:15
回答 4查看 5.4K关注 0票数 17

为什么Java设计器不在java.lang.String类中创建字符串操作方法的静态版本?下面的方法是我所指的,但这个问题也可以扩展到类中的其他非静态方法。

代码语言:javascript
复制
concat(String)                        substring(int, int)
replace(char, char)                   toLowerCase()
replace(CharSequence, CharSequence)   toLowerCase(Locale)
replaceAll(String, String)            toString()
replaceFirst(String, String)          toUpperCase()
split(String)                         toUpperCase(Locale)
split(String, int)                    trim()
substring(int)

只有这些方法的非静态版本强制显式空检查,这类方法必须在任何地方调用。例如,简单地调用example = example.trim()将导致NullPointerException (如果是String example = null )。因此,程序员必须执行以下样板空检查:

代码语言:javascript
复制
if (example != null)
    example = example.trim();
// OR:
example = (example==null) ? null : example.trim();
example = (example==null) ? null : example.substring(5);

我可以想象,如果String有这些方法的静态版本(甚至可能是唯一的),使用输入字符串作为第一个参数会更方便:

代码语言:javascript
复制
example = String.trim(example);
example = String.replace(example, 'a', 'b');
example = String.substring(example, 5);

这将导致程序员编写更干净的代码,这些代码只需返回null,而不是强制程序员显式处理空情况,就可以自动处理空情况。返回null对我来说是有意义的,因为操作空字符串应该会导致空字符串,而不是错误。

为什么Java设计人员在设计Java1或Java2中的String类时没有想到这一点,甚至在以后的Java版本中添加了这样的功能?

EN

回答 4

Software Engineering用户

发布于 2013-12-12 06:41:16

返回null对我来说是有意义的,因为操作空字符串应该会导致空字符串,而不是错误。

这是你的意见。其他人可能会认为,对于不包含字符串的空对象的字符串操作是没有意义的,因此应该抛出异常。

为什么"Java设计者“做或不做一些事情是很难理解的。

已经有一些库可以执行空安全字符串操作,例如Apache的StringUtils。如果需要,可以使用该库或类似的库。

根据您的评论添加

仔细阅读这些注释,您所面临的真正问题似乎是,您必须在所有代码中检查是否有null。这可能是一个糟糕的程序设计的指标,没有明确定义的接口之间的契约。你可能想读在Java中避免!=空“语句?

票数 30
EN

Software Engineering用户

发布于 2013-12-12 07:56:02

整个“如果arg为空,返回空”的编写方法不必要地增加了程序的圈复杂度。

早期的Java使用了返回空方法,但是JDK人员总是在例外情况下防范null。

随着时间的推移,我认为后一种方法已经成为明显的赢家。

为什么?因为空字段破坏了许多oo原则。您根本不能将它们视为多态类的成员。这意味着您总是必须将特殊情况编码为null,因此,当您必须假设事情可以为null时,圈复杂度就会急剧上升。

为了解决问题,请考虑使用空对象模式,而不是依赖空字段。

票数 10
EN

Software Engineering用户

发布于 2013-12-12 07:08:02

并不是说这是原因,但除了toString之外,所有这些方法都很容易封装在一个静态助手类中,而相反的情况则不是真的。

也就是说,如果您想要Stings.toUpper(字符串输入),那么编写它的代码很容易编写,但是如果您想要instance.toUpper,而您所拥有的只是String.toUpper,那么,就是impossible...unless,它们引入了扩展方法,这在当时很可能根本没有考虑过。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/221117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档