这段Java代码有更简洁的写法吗?

6

lookup返回的foo可能为null

因此,我试图通过先检查foo是否为null,然后返回null来避免在null值上调用foo.getFooStr()

但是,有没有更好(更简洁)的方法来编写这个代码呢?

public static String getFooStr(String input)
{
    Foo foo = lookup(input);
    if(foo==null)
    {
        return null;
    }
    return foo.getFooStr();
}

这个问题与以下链接的问题相似(但不完全相同),希望能为您提供一些见解:https://dev59.com/AHVC5IYBdhLWcg3whBaj - Mansoor Siddiqui
4
你所写的没有任何问题。简化内容并不一定使它更好。 - hookenz
2
此外,对于字符串为null或非null的情况,您可以在不同的行中设置断点。这有助于调试。 - Roland Illig
7个回答

34

您有两个问题:是否有一种更好的编写代码的方式,以及是否有一种更简洁的编写代码的方式。

关于更简洁,可以尝试以下方法:

public static String getFooStr(String input) {
    Foo foo = lookup(input);          
    return foo == null ? null : foo.getFooStr();
}

关于better:我更看重易读性,而不是简洁性,并且要远远超过简洁性。你原来的代码看起来很好。重要的是什么对你来看起来好看,哪一个更容易理解和在未来三个月内进行调试。我曾经听过有人这样说——编写代码时要让其他人甚至更重要的是让你未来的自己容易理解。


6
在我看来,只要代码仍然清晰易懂,编写尽可能少的代码是好的。而且这段代码已经满足了这一点。另外,为了更好的可读性,我去掉了括号噪音(例如,使用foo == null代替(foo == null))。希望你不介意。 - Bohemian
5
HFOE说得很好,重要的是让代码更容易被你自己理解和调试,并且让他人也能轻松理解。你去掉的“括号噪音”对于那些像母语一样了解C式操作符语法的人来说可能只是噪音;但对于不太有经验的人(这里指的是更多的人群,但可能不是你的用户),括号使代码更易读,因为他们不必知道?:是否比==优先级更高。我并不是说你去掉括号是错的,但它们不是噪音,而我更可能保留它们。 - LarsH
1
我经常建议我的学生,在他们向我提出关于缩短几毫秒的建议之前,应该首先优化代码的可读性。任何他们节省下来的时间都可能会被下一个程序员在六个月后浪费一小时来理解他们的优化所抵消 :-) - paxdiablo
@paxdiablo 像备份一样,他们需要亲自尝试才能理解为什么 :) 最好在还不重要的时候就开始做。 - Thorbjørn Ravn Andersen

6
为什么没有一个返回适当的 foo 字符串的 "lookup" 功能呢?

3

我不太懂Java,但我喜欢简洁的代码... 源代码应该易于人类阅读和理解 - 机器并不在乎它看起来如何,但您的同事们很在乎。更为简洁的代码通常需要更长时间来理解(有时取决于数量和复杂性,可能需要更长时间)。保持代码易于理解,就可以维护它(即使它有点冗长)!


3

2

对于Java 7,曾经计划过您可以这样编写代码:

public static String getFooStr(String input)
{
    Foo foo = lookup(input);
    return foo?.getFooStr();
}

但在这种功能被广泛知晓之前,您将不得不继续使用?:操作符。


这个在Java7中目前是否可用?如果可能的话,请提供文档链接。我很想了解一下这方面的内容。 - Java Ka Baby
那个功能没有被加入Java7,我怀疑它不会很快被添加。不过C#显然有这个功能;-) - Voo
4
在2009年的Java 7中,Elvis运算符被删除。《Project COIN》网站表示:“尽管对于Groovy来说Elvis运算符和相关运算符很有帮助,但Groovy和Java之间存在差异,例如基本类型的存在以及与装箱/拆箱的交互,这使得这些运算符在Java中不那么有用。JDK 7将支持其他简化空指针处理的方法,例如由JSR 308启用的空指针检查。”(JSR 308是类型注释,并已推迟到JDK 8)。 - Stephen C
1
仅从技术角度来看,Elvis运算符是?:而不是?.?.运算符是空安全解引用运算符。Elvis不是单眼皮。 - Brett Ryan

1

我不喜欢在任何代码中出现多个返回。我会将其更改为

public static String getFooStr(String input)
{
    Foo foo = lookup(input);
    String fooString;
    if(foo!=null)
    {
        fooString = foo.getFooStr();
    }
    return fooString;
}

我认为@Hovercraft Full Of Eels的版本也不错,虽然不太易读,但仍是一种常见的做法。


5
如果您不喜欢多个返回值,请不要查看 Throwable - A.H.
如果上面的代码不够清晰,那么你就不应该编写代码。@EricLindauer - Java Ka Baby
@EricLindauer 你是不是给我点了踩? - Java Ka Baby

0
在Java8中:
Optional.ofNullable(lookup(input)).map(f->f.getFooStr()).orElse(null);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接