避免在java中使用方法时为null
在下面的示例中,我希望避免编写getView!=每次我想使用getView时都为null。为了使它更干净,我创建了一个方法hasView(),它为我进行检查。然而,我仍然得到一个警告。这有什么办法吗避免在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 '
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感谢您的建议,添加了要重用的静态实例