【问题标题】:Refactoring the code in order to avoid assigning an Object to null重构代码以避免将 Object 分配给 null
【发布时间】:2014-11-26 22:15:14
【问题描述】:

我在 Java 中创建了一个简单的方法,但我遇到了一个重大错误,告诉我“将对象分配给 null 是一种代码异味。考虑重构。”。因此我应该考虑重构我的代码,但我不确定我能否找到一种方法来以不同的方式重写我的代码示例。

代码如下:

public static Key buildKey(TypeA a, TypeB b) {
        Date myDate = new JavaDateUtcIsoStringDateConverter().from(String.valueOf(a.getDate));
        Integer DateInt = new JavaDateUtcAvroIntDateConverter().to(myDate);

        TypeNb nb = b.getById(a.getNbId());

        Key.Builder builder = Key.newBuilder();

        builder.setOr(a.getOr());
        builder.setDest(a.getDest());
        builder.setDateInt(DateInt);
        builder.setLine(nb.getLine());
        builder.setIdNb(nb.getIdNb());
        builder.setOpS(nb.getOps() != null && String.valueOf(nb.getOps()).length() > 0 ? String.valueOf(nb.getOps()) : null);
        return builder.build();
    }

主要错误来自builder.setOpS(nb.getOps() != null && String.valueOf(nb.getOps()).length() > 0 ? String.valueOf(nb.getOps()) : null);这一行

如何重构这个简单的条件以避免使用null

有什么建议吗?

谢谢

【问题讨论】:

  • 可能更适合代码审查,因为在最严格的意义上似乎没有实际错误。但是,为什么分配 null 会被视为“代码气味”?
  • 这就是我要求自己说实话。我不知道如何重构。
  • 我没有发现问题,但由于您还检查了字符串长度,您可以将其设置为 "" 。但我认为将其设置为 null 没有任何问题
  • 如果参数是null,你可能甚至不应该调用builder.setOpS()

标签: java object null sonarqube


【解决方案1】:

我想你可以这样做:

if(nb.getOps() != null && String.valueOf(nb.getOps()).length() > 0) {
    builder.setOpS(String.valueOf(nb.getOps());
}

...假设如果 nb.getOps() 为空,则不需要将构建器的值显式设置为 null。

【讨论】:

  • 我认为这对我来说是完美的。谢谢。
【解决方案2】:

如果你不想使用空指针,你应该看看 Java 8 或 GUAVA 中的 optional。

explanation

【讨论】:

    【解决方案3】:

    在 builder 模式中,避免将任何内容显式设置为 null。如果您想将某些内容设置为 null,请不要调用 setter。

    另外,保持简单。您可以将 Apache commons-lang 的 StringUtils 实用程序类用于 String not-null & not-empty

    if (StringUtils.isNotBlank(nb.getOps())) {
    builder.setOpS(String.valueOf(nb.getOps());
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-28
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多