Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回NULL的替代方法_Java_Design Patterns_Null_Return Value - Fatal编程技术网

Java 返回NULL的替代方法

Java 返回NULL的替代方法,java,design-patterns,null,return-value,Java,Design Patterns,Null,Return Value,当未找到foo时,我应该抛出异常,而不是返回null?这有关系吗?在这个问题上有没有“最佳实践”的成语?顺便说一句,我知道我的例子有点做作,但我希望你能理解 谢谢 编辑 更改代码以基于id获取Foo,以更好地说明真实场景。我更喜欢返回null。这是从方法返回的非常好的结果,调用该方法的代码应该适当地处理空值。这可能意味着在调用代码中抛出异常,但我不会用这种方法 这样,如果其他人想要调用您的方法,他们可以根据自己的选择以不同的方式处理空值。若您抛出异常,它可能会迫使另一个程序员以不同于预期的方式修

当未找到
foo
时,我应该
抛出
异常,而不是返回
null
?这有关系吗?在这个问题上有没有“最佳实践”的成语?顺便说一句,我知道我的例子有点做作,但我希望你能理解

谢谢

编辑


更改代码以基于id获取
Foo
,以更好地说明真实场景。

我更喜欢返回
null
。这是从方法返回的非常好的结果,调用该方法的代码应该适当地处理空值。这可能意味着在调用代码中抛出异常,但我不会用这种方法

这样,如果其他人想要调用您的方法,他们可以根据自己的选择以不同的方式处理空值。若您抛出异常,它可能会迫使另一个程序员以不同于预期的方式修改代码


当然,在某些情况下,如果某个对象为null(例如,连接对象或类似对象,实际上需要有一个值,如果没有,则意味着某个对象出错),则抛出异常是有意义的。但是,根据经验,在大多数情况下返回null应该是很好的。

最好的约定是在Javadoc中说,
null
在没有找到匹配项时返回

另一种方法可能是返回一个匹配列表,该列表可能为空(并且可能有多个),但是我不喜欢这种方法

另一种方法可能是返回FOO value类型的NULL\u FOO

我宁愿只返回null


解决此问题的一种方法是查看如何处理该值并丰富函数,以便在方法中使用返回值而不返回。e、 g.如果要使用该值调用方法,只需在函数中调用它,这样就不需要返回任何内容。

主要取决于场景。如果您的应用程序本身就是此方法的生产者和消费者,则完全由您决定要做什么,否则您需要根据方法的使用情况和客户端需要来决定。

如果记录为有效结果,则返回
null
是可以的

另一个选项是空对象模式。也就是说,
Foo
的一个实例没有任何数据:

   /**
     * Returns the foo with the matching id in this list
     * 
     * @param id the id of the foo to return
     * @return the foo with the matching id in this list
     */
    public Foo getFoo(int id)
    {
        for (Foo foo : list)
        {
            if (foo.getID() == id)
            {
                return foo;
            }
        }

        return null;
    }

然后返回它。

返回
null
是完全可以接受的。我会去额外的几十次击键,并在JavaDoc中记录返回
null
的可能性


抛出checked异常意味着您必须在调用方法的任何地方尝试/捕获或重新抛出该异常。未经检查的异常,尤其是NPE以外的任何异常,都会让人大吃一惊。

在本例中,由于您定义的是访问器,因此它应该返回null。如果它是另一个方法,该方法应该保证非空响应,那么异常将更合适


不过,作为补充说明,与其将示例方法称为getter,不如将其命名为
Foo findFoo(Foo f)
,因为您是在搜索,而不仅仅是获取。

如果可以,最好避免异常,但有时您就是不能。在这种情况下,如果您在列表中存储了
null
,该怎么办?您无法区分“find null”和“找不到所需内容”之间的区别

有一种模式,叫做,在Scala中被大量使用。您可以返回一个包含该项的容器,或者返回一个表示“I'm empty”的类的容器。这篇维基文章将提供一个更好的图片

您还可以有一个“集合中是否存在此项?”方法,该方法返回bool,如果您没有首先检查,则会从上述代码中引发异常



只是一个与你的实际问题完全无关的评论。如果实现equals,则仅当两个对象实际上被视为相等时,才会返回true。因此,上面的代码必须始终返回传递给它的对象

返回
null
不仅更易于处理,而且性能也更好。异常必须用于处理异常情况。

我认为这取决于方法的语义

几乎总能在列表中找到
foo
?(例如,如果缓存包含有限数量的对象)。如果是这样,那么找不到可能意味着出了问题——例如,某些应用程序初始化失败,或者密钥无效——并且异常可能是合理的

然而,在大多数情况下,我会返回
null
。也许客户知道对象可能不在那里,并且有代码逻辑来处理该情况;如果使用异常,那么代码将更难阅读、理解和维护

一些API实际上提供了两种方法:可能返回null的
find
方法和引发异常的
get
load
方法


嗯。。。如果有疑问,请选择null:)

我认为这是一个品味问题,在这种情况下,这还取决于列表是否包含null值。如果列表可能包含null值,null也是一个有效的方法参数,您需要区分返回的null(例如,传递、找到和返回null)或者告诉方法调用方未找到传递的null值。

这可能无法直接回答您的问题,但它来自Stackoverflow成员对类似主题的一些评论

当找不到foo时,我应该抛出一个异常,而不是返回null吗?这有关系吗?在这个问题上有没有“最佳实践”的成语?顺便说一句,我知道我的例子有点做作,但我希望你能理解……”

根据我收集的信息,当异常涉及参数时,应该从方法中抛出异常
public class Foo {
    public static final Foo NULL_FOO = new Foo();
}
import static com.google.common.base.Preconditions.checkNotNull;
import static javax.annotation.Nullable;

public class Person {
  ...

  public Person(String firstName, String lastName, @Nullable Phone phone) {
    this.firstName = checkNotNull(firstName, "firstName");
    this.lastName = checkNotNull(lastName, "lastName");
    this.phone = phone;
  }
public Point2D intersect(Line line)