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

jam*_*one 4 java oop null

假设我有一个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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经读过某个地方,返回NULL不是干净代码的一部分.所以我想知道这个案例的等效代码是什么.

更新:我已经阅读了这个问题,我认为我的情况有所不同.在这种情况下,if NULL返回然后什么都不做,而我需要做一些事情,如果NULL返回

Kay*_*man 6

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

许多人认为(包括我)Optional应仅用于返回值,而不是参数,尤其不应用于对象属性.然而,一如既往没有硬规则,只要小心你不要Optional盲目地替换空处理,而不理解你是否从中获得任何好处.

例如,在示例代码中,Optional对您没有任何好处.由于您执行某些操作而不管是否为null,因此您只需更改if(s == null)if(s.isPresent()).但是,如果逻辑只在s为非null的情况下才能执行某些操作,那么在没有a的情况下,else您可以使用它Optional.ifPresent()来使事情变得更清晰.当然,还有其他有用的方法Optional可以为您提供更清晰的代码,例如orElse()可以有效地使用默认值的代码.


eri*_*cbn 5

看起来您的意思是特殊情况模式(特定实现是选项空对象模式)。

Java 8GuavaOptional库中有 Option 类型的 Java 实现,名为。

在您的情况下,您将使用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
}
Run Code Online (Sandbox Code Playgroud)

因此,关于返回可选对象的代码是不言自明的。然后你会:

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
}
Run Code Online (Sandbox Code Playgroud)