在Java类中设计方法时,某些参数对于其执行而言可能是可选的。 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的。
从本文中, 您将学习如何在Java中处理可选参数 。 我们将专注于常规方法,带有可选字段的类构造函数,并快速查看所讨论主题的不良做法。 我们将停下来看一下Java 8 Optional,并评估它是否符合我们的需求。
让我们开始吧。
1.可选方法参数
您可以通过几种不同的方法来处理Java可选参数。 我将引导您从最简单到更复杂。
@Nullable注解
为什么只是不传递null? 这是一个简单的解决方案,不需要任何额外的工作。 您没有任何需要作为方法参数之一的对象吗? 没问题。 只需传递null即可,编译器很高兴。
这里的问题是可读性。 调用方法的程序员如何知道他是否可以安全地传递null? 对于哪些参数可以接受空值,哪些是必需的?
为了清楚表明null是有效输入,可以使用@Nullable批注。
User createUser(String name, @Nullable Email email) {
// ...
}
您不同意此方法声明是不言自明的吗?
尽管很简单,但是null传递方法的问题在于它很容易失控。 团队可能会Swift开始过度使用它,并使代码库难以维护,并带有大量的空检查条件 。
不过,还有其他选择。
可选清单
代替null,我们有时可以创建一个空的类表示形式。 考虑一下Java集合。 如果方法接受列表或映射,则永远不要使用null作为输入。
空集合总是比空集合好,因为在大多数情况下,不需要任何特殊处理。
您可能想知道为什么要浪费内存来创建空集合。 毕竟,null不会花费您任何费用。
您的怀疑是有道理的。 幸运的是,有一个简单的解决方案。
每当需要空的代表时,就不应创建集合的新实例。 在代码库中重复使用同一实例。
你知道吗? Java已经具有您可以使用的所有集合的空实例。 您可以在Collections实用程序类中找到它们 。
User createUser(String name, List<Rights> rights) {
// ...
}
import java.util.Collections;
// ...
create("bob", Collections.emptyList());
空对象模式
空集合的概念也适用于其他类。 空集合只是具有零元素的常规集合。 同样,您可以考虑应用程序中的其他对象。
Null对象是表示缺失值的类的特殊实例。 如果某些方法期望将对象作为参数,则始终可以传递Null对象表示形式,而不必担心它将在运行时导致意外的异常。