避免在java中使用方法时为null

避免在java中使用方法时为null,java,android,intellij-idea,Java,Android,Intellij Idea,在下面的示例中,我希望避免编写getView!=每次我想使用getView时都为null。为了使它更干净,我创建了一个方法hasView(),它为我进行检查。然而,我仍然得到一个警告。这有什么办法吗 import android.support.annotation.Nullable; public void showView(){ if(hasView()){ getView().show(); // Shows warning Method invocation '

在下面的示例中,我希望避免编写getView!=每次我想使用getView时都为null。为了使它更干净,我创建了一个方法hasView(),它为我进行检查。然而,我仍然得到一个警告。这有什么办法吗

import android.support.annotation.Nullable;

public void showView(){
    if(hasView()){
        getView().show(); // Shows warning Method invocation 'showLoading' may produce 'java.lang.NullPointerException'
    }
}


boolean hasView(){
    return getView() != null;
}

@Nullable
private View getView(){
    return view;
}

我正在使用Android Studio/IntelliJ。我知道我可以使用@SuppressWarnings,但这会使代码更难看

您可能对使用Android API级别24中添加的感兴趣,例如:

private Optional<View> getView() {
    return Optional.ofNullable(view);
}

public void showView() {
    getView().ifPresent(View::show);
}
private可选getView(){
返回可选。不可用(视图);
}
public void showView(){
getView().ifPresent(视图::显示);
}
我想避免编写getView!=每次我想使用时都为null getView

您可以使用空对象模式来避免检查
!=空
在程序中的任何地方,代码如下所示:

(1)定义一个EmptyView类

   public EmptyView {

     //Define a static emptyView, so that we can reuse the same object
     public static final EmptyView emptyView = new EmptyView();

     public show() {
         //does nothing
      }
    }
(2)如果没有可用视图,请使用空视图:

    //other classes:
    private View getView(){
        if(viewAvailable) {
           return view;
        } else {
            return EmptyView.emptyView;
        }  
    }

    public void showView(){
        getView().show();
    }
您可以查看Wiki更多信息和Java示例

当您从各种方法返回
null
时,它们可能会导致程序中出现
NullPointerException
,并且在较大的项目中很难调试

因此,从方法返回
null
是一种不好的做法(&应该避免),这就是为什么SpringAPI在尝试从
DAO
/
存储库
类检索数据时通常返回空的
列表
/
对象(而不是
null
)的原因(如上文所述,如
EmptyView
对象)

p.S.:此选项适用于有无Java8。
如果您使用的是Java8,那么更喜欢使用@janos

的答案中给出的
Optional
,对不起,您的问题是什么?showLoading()在哪里?当视图为空时,你的应用程序会做什么?如果无法获取/检索视图,我会考虑停止应用程序并报告问题。@GhostCat抱歉。我的问题是如何避免警告并编写更干净的代码。@StefanFreitag我只是以getView为例。它可能是任何返回空值的方法这个选项是我想到的第一个选项,通过你的回答我知道它在Android中可用:)谢谢,这很好,但不幸的是,我目前的项目没有使用Java8。但我将来肯定会使用它。:)谢谢我没有使用Java8,所以我必须使用这个模式。唯一令人恼火的是,每次我在视图中添加一个方法时,我也必须将其更新为EmptyView。你能告诉我一个示例方法,比如你需要添加什么吗?很好的建议。如果定义EmptyView的静态实例,也可以避免执行“new EmptyView()”。因为它是“空”的,所以它在定义上是不可变的,重用它没有副作用。@javaguy我的意思是,如果我添加了say getView().hide()或getView().foo(),那么我也必须将它们添加到EmptyView中。@Insac感谢您的建议,添加了要重用的静态实例