显然,Java编程中最大的问题之一是null和null指针异常。有哪些设计模式可以不会增加太多代码但减少空指针异常的问题呢?
显然,Java编程中最大的问题之一是null和null指针异常。有哪些设计模式可以不会增加太多代码但减少空指针异常的问题呢?
空对象模式. 请查看Google Guava库的Optional类。
他们的维基上有一篇关于使用和避免null的文章。
请习惯于在方法中不返回null对象。
public MyObject bohemianRhapsody(){
try {
if(isThisTheRealLife())
return new MyObject("is this just fantasy");
else
return new MyObject("caught in a landslide, no escape from reality");
} catch(ExampleCatchableException e){
return new MyObject(""); // instead of return null
}
}
...
System.out.println(bohemianRhapsody()); // will never print null
这也(有点)被称为空对象模式。
ToString
在界面上显示 - 你应该返回MyObject(null)
,并在特殊情况下简单地使ToString()
返回空字符串。 这样,调用代码仍然可以检查结果是否为null(可能使用IsNull()
方法),但不会出现null异常。 可以参考C#中的Nullable<>
类作为一个很好的例子。 - George Mauernull
而期望其他值是出现问题的首个迹象之一。只有在确认适合时,才应使用诸如 Null Object Pattern
等设计模式。设计模式的最大缺点之一是滥用或误用。if(list.get(-1).equals(nullObject))
这样更糟糕。我认为在参数不符合预期或不兼容时引发异常会更好。
"something definetly not null".equals(maybeNullVar)
vs
maybeNullVar.equals("something definetly not null")
Null
有一个(通常是坏的)含义,不应该像其他一般状态一样对待。if (obj != null)
则非常直观。如果你的应用程序在运行时开始生成NPE,则说明你做错了什么,需要修复它。不要试图隐藏异常,而是修复引起异常的任何问题。public static boolean isBlank(final String str)
{
return (str == null) || str.isEmpty();
}
public static boolean isNotBlank(final String str)
{
return !StringUtils.isBlank(str);
}
public static boolean isEqual(final String s1, final String s2)
{
if (s1 == s2) { return true; }
if ((s1 == null) || (s2 == null)) { return false; }
return s1.equals(s2);
}
public static boolean isNotEqual(final String s1, final String s2)
{
return !StringUtils.isEqual(s1, s2);
}
您不必使用任何设计模式。
只需在声明期间初始化变量。
例如:
List<String> names = new ArrayList<String>();
Map<String,String> pairs = new HashMap<String,String>();