在下面的示例中,我希望每次要使用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 I have seen this question但这会使代码变得更加丑陋。
答案 0 :(得分:7)
我希望每次想要使用时都避免编写getView!= null getView?
您可以使用 Null对象模式来避免在程序中的任何位置检查!= null
,代码如下所示:
(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)如果没有可用的视图,请使用EmptyView:
//other classes:
private View getView(){
if(viewAvailable) {
return view;
} else {
return EmptyView.emptyView;
}
}
public void showView(){
getView().show();
}
您可以查看Wiki here更多信息& Java示例。
当您从各种方法返回null
时,它们可能会导致程序中的NullPointerException
,并且在较大的项目中将变得非常难以调试。
因此,从方法中返回null
是一种不好的做法(并且应该避免它们),这就是Spring API通常返回空list
/ set
个对象的原因(尝试从null
/ DAO
类(如上文所述的Repository
对象)检索数据时,而不是EmptyView
)。
P.S。:此选项适用于Java8和不使用Java8。
如果您使用的是Java8,那么更喜欢使用@janos的答案中给出的Optional
答案 1 :(得分:4)
您可能有兴趣使用在Android的API级别24中添加的Optional
,例如:
private Optional<View> getView() {
return Optional.ofNullable(view);
}
public void showView() {
getView().ifPresent(View::show);
}