【问题标题】:Avoiding != null using a method in java使用java中的方法避免!= null
【发布时间】:2017-03-26 19:34:48
【问题描述】:

在下面的示例中,我想避免每次使用 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 但这会使代码更难看。

【问题讨论】:

  • 抱歉,您有什么问题?
  • showLoading() 在哪里?
  • 当视图为空时你的应用会做什么?如果无法获取/检索视图,我会考虑停止应用程序并报告问题。
  • @GhostCat 对不起。我的问题是如何避免警告并编写更清晰的代码。
  • @StefanFreitag 我只是以 getView 为例。它可能是任何返回空对象的方法。

标签: java android intellij-idea


【解决方案1】:

我想避免每次我想使用时都写 getView != null 获取视图?

您可以使用Null Object模式避免在程序中到处检查!= 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,那么更喜欢使用@janos 的答案中给出的Optional

【讨论】:

  • 谢谢。我没有使用 Java8,所以我将不得不使用这种模式。唯一烦人的是,每次我向 View 添加方法时,我都必须将其更新为 EmptyView。
  • 你能告诉我一个示例方法,比如你需要添加什么吗?
  • 好建议。如果您定义 EmptyView 的静态实例,您也可以避免执行“new EmptyView()”。因为它是“空的”,所以它在定义上是不可变的,重用它没有副作用。
  • @javaguy 我的意思是,如果我添加说 getView().hide() 或 getView().foo() 那么我也必须将它们添加到 EmptyView 中。
  • @Insac 感谢您的建议,添加静态实例以重用
【解决方案2】:

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

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

public void showView() {
    getView().ifPresent(View::show);
}

【讨论】:

  • 可选是我想到的第一个选项,并且从您的回答中了解到它在 Android 中可用:)
  • 谢谢,这很好,但不幸的是我没有在我当前的项目中使用 Java8。但我肯定会在未来使用它。 :)
猜你喜欢
  • 2021-02-03
  • 2020-12-27
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 2017-04-27
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多