问题
这个问题本来是找出是否有人的方式知道修改了Eclipse的equals()和hashCode()模板来生成以下模式用于字符串(使null等于“”)。Eclipse的equals()方法的模板了空字符串==空字符串
if ([value] == null || [value].length() == 0) {
if (other.[value] != null && other.[value].length() > 0) {
return false;
}
} else if (![value].equals(other.[value])) {
return false;
}
提出的一种解决方案
很多答案都建议正火输入在设置器(无论是将所有空字符串空值,或空值为空字符串)。我觉得这很危险。这里有两个合法的代码片断,如果用户不知道这种副作用,它会使程序崩溃。
如果所有的空字符串由空值,这将崩溃:
myObject.setName("");
String uppercaseName = myObject.getName().toUpperCase();
如果所有空值由空字符串,这将崩溃(辩论的这个可取之外,我一般会期望它的工作):
myObject.setName(myStringSubclassInstance);
MyStringSubclass string = myObject.getName().someCustomSubclassMethod();
如果我去了这条道路,我会做的setter将引发InvalidArgumentException和拼写出来的文档。这是恕我直言的正确方法。
更好的解决方案
最终,我不认为任何推荐的解决方案是合适的。这不是他们的错,因为这是原始问题的错。在考虑反馈意见后,我同意最初的问题是基于一种不可取的解决方案。我不能删除它,所以我编辑它以避免误导他人。
我决定去使用Builder Pattern来规范build()方法中的值。这会导致对象始终具有null或空字符串,但不会为setter或equals()方法添加副作用。
存在'String#isEmpty()'。顺便说一句:这是老实说,一个可怕的想法。您需要以不同的方式解决空字符串问题。 – BalusC 2010-09-11 03:17:00
@BalusC我不是纯粹主义者。等价是主观的,在这种情况下,我选择将String属性的等价定义为!null &&!empty && equal或null ||空。我意识到我的应用程序中这些对象的用例,并为我的目的一个空==“”。我知道,我可以修改所有的setter来放弃空字符串或其他东西,但我认为这没什么更好的。 – DougW 2010-09-11 03:41:15