首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免在函数(JAVA)中返回空值?

如何避免在函数(JAVA)中返回空值?
EN

Stack Overflow用户
提问于 2015-04-28 19:21:48
回答 4查看 6.9K关注 0票数 6

假设我有一个List<SomeObject>,并且有一个函数可以返回该对象引用。

代码语言:javascript
运行
复制
SomeObject GetSomeObject(List<SomeObject>, int x){
    /* Search for object in list that has a properties
        with value x */

    if (found)
        return /* The object found */
    else
        return NULL;
}

void DoSomething(SomeObject S){
    if(S!=NULL){
        /* Do action 1 */
    }
    else{
        /* Do action 2 */
    }
}

我在某处读到过返回NULL不是干净代码的一部分。所以我想知道这个例子的等效代码是什么。

更新:我读过this question,我觉得我的情况有所不同。在这种情况下,如果返回NULL,则不执行任何操作,而如果返回NULL,则需要执行一些操作

EN

回答 4

Stack Overflow用户

发布于 2015-04-28 19:24:39

如果您使用的是Java8,请考虑Optional类,但请注意,它并不适用于所有地方。

许多人认为(包括我在内) Optional应该只用于返回值,而不是参数,尤其是不能用于对象属性。然而,像往常一样,没有硬规则,只是要小心,不要盲目地用Optional代替null处理,而不知道你是否从中获得了任何好处。

例如,在示例代码中,Optional不会给您带来任何好处。由于无论是否为if(s.isPresent())都要执行一些操作,因此只需将if(s == null)更改为null即可。但是,如果逻辑只有在s不为空的情况下才执行某些操作,那么在没有else的情况下,您可以使用Optional.ifPresent()来使事情变得更清晰一些。当然,Optional中还有其他有用的方法可以让您获得更干净的代码,比如orElse(),它可以有效地用于使用默认值。

票数 6
EN

Stack Overflow用户

发布于 2015-04-28 20:09:07

看起来您指的是special case模式(特定的实现是OptionNull Object模式)。

Java 8Guava库中有名为Optional的Option类型的Java实现。

在您的示例中,您将使用Optional<SomeObject>并拥有此实现(我使用的是Guava实现):

代码语言:javascript
运行
复制
Optional<SomeObject> getSomeObject(List<SomeObject>, int x) {
    /* Search for object in list that has a properties
        with value x */
    if (found) {
        return Optional.of(objectFound);
    } else {
        return Optional.absent(); // or Optional.empty(); in Java 8
    }
    // if objectFound variable is null when not found, you can simply use
    // return Optional.fromNullable(objectFound);
    // or return Optional.ofNullable(objectFound); in Java 8
}

因此,返回一个可选对象的代码是自解释的。然后,您将拥有:

代码语言:javascript
运行
复制
void doSomething(Optional<SomeObject> o) {
    if (o.isPresent()) {
        SomeObject someObject = o.get();
        /* Do action 1 */
    } else {
        /* Do action 2 */
    }
    // or opt.map(/* action 1 */).orElse(/* action 2 */); in Java 8
}
票数 4
EN

Stack Overflow用户

发布于 2015-04-28 19:24:50

您可以抛出NoSuchElementException,这与"fail fast"的方法很好地结合在一起。

然而,,如果你的代码开始使用流控制的异常机制-这是一个非常大的禁忌,你应该避免它。

一个很好的经验法则是,只有当你的API也支持contains() (或HasSomeObject(obj))方法时,如果元素不存在,就抛出一个异常。

免责声明:这个答案适用于java-8之前的代码,对于java8,更好的实践可能是可选的,as suggested by @Kayman

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29918073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档