Java 单行中的双空检查

Java 单行中的双空检查,java,null,final,Java,Null,Final,以下代码是在一行中检查null两次以初始化final变量的最佳方法吗 final String textValue = text != null ? text.getText() != null ? text.getText() : "" : ""; 我可能会使用带有&&条件的单个条件: final String textValue = text != null && text.getText() != null ? text.getText()

以下代码是在一行中检查
null
两次以初始化
final
变量的最佳方法吗

final String textValue = text != null ? text.getText() != null ? text.getText() : "" : "";

我可能会使用带有
&&
条件的单个条件:

final String textValue = text != null && text.getText() != null ? text.getText()
                                                                : "";
如果您发现需要在多个位置执行此操作,您可能希望将其包装在一个方法中:

// We don't know what the type of text is here... adjust appropriately.
public static String getTextOrDefault(TextBox text, String defaultValue)
{
    return text != null && text.getText() != null ? text.getText()
                                                  : defaultValue;
}
或进行调整以避免多次调用
getText()

// We don't know what the type of text is here... adjust appropriately.
public static String getTextOrDefault(TextBox text, String defaultValue)
{
    if (text == null)
    {
        return defaultValue;
    }
    String textValue = text.getText();
    return textValue != null ? text.getText() : defaultValue;
}
然后可以简化变量声明:

final String textValue = SomeHelper.getTextOrDefault(text, "");
请注意,是否多次调用
text.getText()
是一个问题,取决于您的场景-在某些情况下,这是一个坏主意,您应该重新构造代码以避免它。我们无法确定,但值得考虑。

您可以这样做:

final String textValue = (text != null && text.getText() != null) ? text.getText() : "" ;

我不知道你所说的“最佳”(对程序员最友好?执行效率最高?)

但程序员友好的替代方案可能是:

final String textValue = (text != null && text.getText() != null) ? text.getText() : "";

我假设这条线在某个方法中的某个地方。因此,这本书更具可读性:

String value = "";
if (text != null && text.getText() != null) {
  value = text.getText();
}
final String textValue = value;

text!=null&&text.getText()!=空
-记住
&
|
短路。虽然,我会尝试确保
text
永远不能为null,并且
getText
永远不能返回null,但这可能只是一厢情愿的想法?
如果(text!=null&&text.length()=0)
您可以通过执行
text!=null&&text.getText()!=无效的text.getText():“”如果您觉得这对于您的程序员同伴来说非常容易理解,那么请继续;-)@奥宾:为什么不呢?对于这种情况,它大概是好的——如果它是一个“长期手术”或有副作用,那么就没有了。@Aubin:也许吧。也许不是。如果不知道所涉及的类,我们真的不知道。出于性能原因,我不知道(我也不想知道)getText()方法有多复杂。在“方法”版本中,三元应替换为两行。@Aubin让JIT来处理这个问题。@Aubin:我编辑了答案,给出了这个选项,但简单性常常战胜了潜在的(但不现实的)性能问题。例如,我很高兴在一个循环中调用
ArrayList.size()
。@LuiggiMendoza然后你可以向上投票他的答案,向下投票我的答案。我已经不再从自称的主持人那里拿任何东西了。我不需要投你的反对票,因为有些人回答了OP的问题。@TheNewIdiot:没有人建议投反对票-没有必要这么咄咄逼人。像往常一样,友好的提问地点和敌对的回答地点也是如此-/@TheNewIdiot:Stack Overflow拥有数百万用户。仅仅因为你和一些人有过不好的经历就对每个人都有攻击性,这并不是一个好的策略。