为什么Java设计器不在java.lang.String类中创建字符串操作方法的静态版本?下面的方法是我所指的,但这个问题也可以扩展到类中的其他非静态方法。
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 )。因此,程序员必须执行以下样板空检查:
if (example != null)
example = example.trim();
// OR:
example = (example==null) ? null : example.trim();
example = (example==null) ? null : example.substring(5);我可以想象,如果String有这些方法的静态版本(甚至可能是唯一的),使用输入字符串作为第一个参数会更方便:
example = String.trim(example);
example = String.replace(example, 'a', 'b');
example = String.substring(example, 5);这将导致程序员编写更干净的代码,这些代码只需返回null,而不是强制程序员显式处理空情况,就可以自动处理空情况。返回null对我来说是有意义的,因为操作空字符串应该会导致空字符串,而不是错误。
为什么Java设计人员在设计Java1或Java2中的String类时没有想到这一点,甚至在以后的Java版本中添加了这样的功能?
发布于 2013-12-12 06:41:16
返回null对我来说是有意义的,因为操作空字符串应该会导致空字符串,而不是错误。
这是你的意见。其他人可能会认为,对于不包含字符串的空对象的字符串操作是没有意义的,因此应该抛出异常。
为什么"Java设计者“做或不做一些事情是很难理解的。
已经有一些库可以执行空安全字符串操作,例如Apache的StringUtils。如果需要,可以使用该库或类似的库。
根据您的评论添加
仔细阅读这些注释,您所面临的真正问题似乎是,您必须在所有代码中检查是否有null。这可能是一个糟糕的程序设计的指标,没有明确定义的接口之间的契约。你可能想读在Java中避免!=空“语句?
发布于 2013-12-12 07:56:02
整个“如果arg为空,返回空”的编写方法不必要地增加了程序的圈复杂度。
早期的Java使用了返回空方法,但是JDK人员总是在例外情况下防范null。
随着时间的推移,我认为后一种方法已经成为明显的赢家。
为什么?因为空字段破坏了许多oo原则。您根本不能将它们视为多态类的成员。这意味着您总是必须将特殊情况编码为null,因此,当您必须假设事情可以为null时,圈复杂度就会急剧上升。
为了解决问题,请考虑使用空对象模式,而不是依赖空字段。
发布于 2013-12-12 07:08:02
并不是说这是原因,但除了toString之外,所有这些方法都很容易封装在一个静态助手类中,而相反的情况则不是真的。
也就是说,如果您想要Stings.toUpper(字符串输入),那么编写它的代码很容易编写,但是如果您想要instance.toUpper,而您所拥有的只是String.toUpper,那么,就是impossible...unless,它们引入了扩展方法,这在当时很可能根本没有考虑过。
https://softwareengineering.stackexchange.com/questions/221117
复制相似问题