显然,Java编程的最大祸害之一是空值和空指针异常。哪些设计模式不会为代码添加太多但减少沙空指针异常的问题?
答案 0 :(得分:11)
Null Object pattern。查看Optional中的google-guava library课程。
他们的wiki在使用和避免空值方面有article。
答案 1 :(得分:4)
最佳设计模式 - Check Not-Null Idiom
if(obj != null) {
...
}
答案 2 :(得分:3)
习惯于不在方法上返回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
另外(种类)称为Null-Object pattern。
答案 3 :(得分:3)
为什么要避免空指针异常?在期待其他内容时获得null
,这是您编写代码时出现问题的第一个迹象之一。当您确定它足够时,应该使用Null Object Pattern
之类的东西。设计模式的最大缺点之一是滥用\滥用。
编辑:
我认为减少空回报的最佳方法是增加异常的使用。想想当你尝试访问索引-1处的元素时返回null对象的List,你会使用像
这样的东西 if( list.get(-1).equals(nullObject))
更糟糕的是。我认为,当参数是意外或不兼容时,最好引发异常。
答案 4 :(得分:3)
IntelliJ为这些目的设计了一些有用的注释: @Nullable 和 @NotNull
Detecting probable NPE’s
答案 5 :(得分:2)
我想这是一个品味问题,但我会说像Smalltalk / Objective-C这样的语言最大的祸害就是它们没有null并且没有任何NullPointerExceptions。我不是“Null对象模式”的粉丝,事实上我很激动它,因为我发现它使故障排除和查找错误更加困难而没有任何实际好处。 Null
具有意义(通常是坏的),不应该被视为任何其他通用状态。
就像在这个帖子中提到的那样,NPE非常强大,并且是在早期捕捉语法错误或错误编码的好方法,if (obj != null)
非常简单。如果您的应用程序在运行时开始生成NPE,那么您已经做错了,您需要修复它。不要试图隐藏异常,修复导致异常的任何内容。
答案 6 :(得分:2)
"something definetly not null".equals(maybeNullVar)
vs
maybeNullVar.equals("something definetly not null")
答案 7 :(得分:1)
这些方法(参见Apache commons-lang)可以通过将它们封装在保留代码语义含义的方法中来减少String处理的空检查负担:
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);
}
答案 8 :(得分:1)
您不必使用任何设计模式。
在声明期间初始化变量。
e.g。
List<String> names = new ArrayList<String>();
Map<String,String> pairs = new HashMap<String,String>();