有什么好的轻量级设计模式可以避免Java中的空值?

时间:2012-02-06 15:21:33

标签: java design-patterns nullpointerexception null

显然,Java编程的最大祸害之一是空值和空指针异常。哪些设计模式不会为代码添加太多但减少沙空指针异常的问题?

9 个答案:

答案 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>();