【问题标题】:Checking for null at initialization [closed]在初始化时检查 null [关闭]
【发布时间】:2013-02-21 22:29:25
【问题描述】:

我用一个可以返回任何字符串或null的方法设置一个字符串。

我希望字符串为"",只要它是null。所以我使用:

String mString = getMyString();
mString = mString==null ? "" : mString;

或者(效率较低,但在一行中):

String mString = getMyString() == null ? "" : getMyString();

有什么更简洁的方法吗?

编辑:我考虑过使用 if 语句:

String mString = getMyString();
if (mString == null); mString = "";

哪一个(第一个或第三个)会执行得更快?

【问题讨论】:

  • 将其移入方法中,永不返回null
  • 这是一个闭源方法,我没有访问权限。
  • 然后...编写调用该方法的方法:)您正在做的很好,实际上有很多方法可以解决...但是它们都做同样的事情.
  • if 语句上使用标准布局是一个不错的主意...
  • 由于if 语句后面的分号,您的字符串现在将始终"",即使之前不是null

标签: java variables null initialization


【解决方案1】:

许多错误会导致 nulls 传播。如果您的意思是空字符串,最好使用空字符串。收藏也一样。所以尽早抛出 NPE。 Java SE 7 引入了(一种冗长、大写错误、位置不佳的)方法来执行此操作。

String mString = java.util.Objects.requireNonNull(getMyString());

【讨论】:

  • 大写不正确是什么意思?我认为该方法在这种情况下没有帮助,因为它会抛出 NPE 而不是 fixing 值。
  • 通常连字符的单词只有前导路径大写(如果合适)。就像有删除连字符的趋势一样 - 不要想不协调。 / 值几乎可以肯定是坏的。修复隐藏了问题,这是一个非常糟糕的主意。
  • 我同意隐藏问题是个坏主意(在大多数情况下)。就方法名称而言,它完全符合 Java 命名约定,恕我直言。类名以大写字母开头,方法以小写字母开头,然后使用驼峰式。
  • 此解决方案仅适用于我们使用 Java 7 的用户
  • @user1428716 Java SE 6 将不再有公开支持的更新,因此 7 是一个好主意。只是具体方法需要 Java SE 7 - 编写等效代码并不太难。
【解决方案2】:

不,不是真的:)

或者您可以创建另一个名为 getMyNonNullString 的方法来为您完成 - 祝您好运!

【讨论】:

    【解决方案3】:

    就像 Brian Roach 评论的那样:

    如果您可以控制getMyString(),请以返回空字符串而不是null 的方式实现它。否则我也使用你的第一种方法(尝试优化它以进行分支预测):

    String mString = getMyString();
    // if I know getMyString() might return null and I can't change it:
    mString = mString != null ?  mString : "";
    

    【讨论】:

      【解决方案4】:

      我建议使用 Apache Common 的:

      StringUtil.isBlank(strVariable);

      这是标准化项目的好方法,尤其是大型项目。否则你必须到处重复你的家常逻辑。

      以下是供您参考的链接:http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/StringUtils.html

      【讨论】:

      • 我曾经在一个大型项目(10k 类)上编写代码......这真的很好用。
      【解决方案5】:

      第二个绝对不是要走的路,因为它不一样。

      但不要做任何这些。写一次像下面这样的便利函数,然后静态导入,这样意图就清楚了。

      public static @Nonnull String nullToEmptyString(@Nullable String s) {
        return s != null ? s : "";
      }
      

      【讨论】:

        【解决方案6】:

        我会做第三种形式。性能方面应该不会有任何明显的差异。

        【讨论】:

          【解决方案7】:

          我可以建议一种不同的方法。由于 MACOSX 的限制,我还没有 JAVA 7,所以如果有语法错误,请指导我。欢迎评论

          这是基于我在 Stacoverflow 错误上提出的问题:Why is the switch statement faster than if else for String in Java 7?

           The Java compiler generates generally more efficient bytecode from switch statements that   
           use "String objects" than from chained if-then-else statements.
          

          So , --> Switch 语句会比 if-else 块更有效。 try-catch 的性能值得商榷

             String str = getMyString(); // only one call
          
             try {
              switch (str) {
                default:   break;
              }
          
              } catch(NullpointerException e){
          
                str="";//Null means Str is null
              }
          

          【讨论】:

          • 对选民关心的解释?
          • 只是在这里猜测可能的原因:(a) 以这种方式使用异常作为控制流绝对不是更干净的代码(并且可能是much slower;(b) 带有字符串的 switch 语句不太可能如果只有一个案例,效率会更高。
          猜你喜欢
          • 2018-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-28
          • 2012-01-09
          相关资源
          最近更新 更多