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

muk1a3rh  于 2021-07-13  发布在  Java
关注(0)|答案(4)|浏览(344)

我应该有一个 List<SomeObject> 并有一个函数返回该对象的引用(如果可用)。

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 不是干净代码的一部分。所以我想知道这个案子的等效代码是什么。
更新:我读过这个问题,我认为我的情况是不同的。在这种情况下,如果 NULL 是回来了就什么都不做,而我需要做些什么如果 NULL 被退回

lsmepo6l

lsmepo6l1#

如果您使用的是Java8,请考虑可选类,但请注意,它并不适用于任何地方。
许多人(包括我在内)认为 Optional 应该只用于返回值,而不是参数,尤其是不用于对象属性。不过,一如既往地,没有硬性规则,只是要小心不要将null处理替换为 Optional 如果你从中得到任何好处,就盲目地,不理解。
在示例代码中, Optional 对你没有任何好处。因为不管是否为null,您都会执行一些操作,所以您只是在更改 if(s == null)if(s.isPresent()) . 但是,如果逻辑仅在s为非空且没有 else 你可以使用 Optional.ifPresent() 把东西弄干净一点。当然还有其他有用的方法 Optional 这将为您提供更清晰的代码,例如 orElse() 它可以有效地用于使用默认值。

iqxoj9l9

iqxoj9l92#

看起来您指的是特殊的case模式(特定的实现是option或null对象模式)。
有选项类型的java实现,名为 Optional ,在Java8和guava库中。
在你的情况下,你将使用 Optional<SomeObject> 还有这个实现(我使用的是guava实现):

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
}

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

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
}
xxb16uws

xxb16uws3#

你可以抛出nosuchelementexception,这与“fail fast”的美沙酮很好地吻合。
但是,如果您的代码开始对流控制使用异常机制,这是一个非常大的禁忌,您应该避免它。
一个好的经验法则是在元素不存在时抛出异常,前提是您的api还支持 contains() (或 HasSomeObject(obj) )方法。
免责声明:这个答案适用于java-8之前的代码,对于java8,更好的实践可能是可选的,正如@kayman所建议的

ewm0tg9j

ewm0tg9j4#

您可以考虑的一种常见方法是空对象模式。
不是返回null,而是返回一个正确对象类型的示例,当您调用它的方法时,它什么也不做。它并不适合所有的情况,但它值得考虑。

相关问题