java.util.Objects与Optional哪个更可取?

30 浏览
0 Comments

java.util.Objects与Optional哪个更可取?

Java 9中,java.util.Objects类新增了一些方法,分别是Objects#requireNonNullElseObjects#requireNonNullElseGet()。这两个方法在Java 9中引入。如果第一个参数非空,则返回第一个参数;否则返回非空的第二个参数或者supplier.get()的非空值。但这个新功能与Optional类中已有的方法Optional#orElseOptional#orElseGet重叠。唯一的区别在于,Objects中的第二个参数或supplier的返回值必须为非空,否则将抛出NPE异常。现在应该使用Optional还是Objects?新方法是否使得ObjectsOptional更受欢迎,因为它们会立即抛出NPE,而不像Optional那样在代码的其他位置才抛出?如果我有一个类似于以下的旧代码:\n

String str = null;
String result = str == null ? "other string" : str;

\n这只是一个简单的方法内部检查。我希望使用最新的语言特性对其进行重构。那么,考虑到Optional.orElseObjects.requireNonNullOrElse之间的差异,哪个更好?是\n

result = Optional.ofNullable(str).orElse("other string");

\n还是\n

result = Objects.requireNonNullOrElse(str,"other string);

0
0 Comments

在这段内容中,提出了一个关于使用`java.util.Objects`和`Optional`的问题。问题的原因是,`java.util.Objects`类和`Optional`类都提供了类似的方法,用于处理可能为空的对象。解决方法是根据具体情况选择使用哪个类的方法。

首先,两个方法的签名是不同的。`java.util.Objects`的方法签名为:

public static  T requireNonNullElse(T obj, T defaultObj)

而`Optional`的方法签名为:

public static  T requireNonNullElseGet(T obj, Supplier supplier)

`java.util.Objects`类的方法会根据传入的参数判断是否为空,如果为空,则返回默认值;而`Optional`类的方法会根据传入的参数判断是否为空,如果为空,则返回由提供的`supplier`提供的非空值。

所以,答案是:如果你想要使用`supplier`,则使用`Optional`的方法;否则,使用`java.util.Objects`的方法。

这样做的原因是,当你在两个选项之间做出选择时,你更倾向于选择那个更容易使用的。换句话说,为什么要提供一个`supplier`,当你可以不用呢。

另外,需要注意的是,`Optional`主要用于返回类型,而不是作为方法参数。因此,在使用`Optional`时要注意其主要目标。

此外,更新一个已经在使用中的类的方法几乎总是不可取的。你绝对不想改变已经公开使用并由你的客户使用的东西的语义。

关于使用`Optional`的一个方面是,`Optional#orElseGet`和`Objects.requireNonNullElseGet`都接受`supplier`参数。唯一的区别是,如果`supplier.get()`返回`null`,第二个方法将抛出`NullPointerException`。

最后一个段落中解释了这一点——给我们提供Java的人认为在方法参数中使用`Optional`不是一个好的实践,所以为什么他们会提供一个正式的方法签名来做这件事呢?

总之,在这种情况下,如果想要重构一个检查是否为空的方法,可以选择使用`Optional`或`Objects`的方法,具体取决于个人偏好。

0
0 Comments

在Java的开发中,经常会遇到需要处理null值的情况。为了解决这个问题,Java提供了两种常用的处理方式:java.util.Objects类和java.util.Optional类。然而,对于开发人员来说,到底该使用哪种方式是一个值得思考的问题。

首先,为什么JDK开发人员没有更新Optional类中的现有方法呢?这是因为这样做会引入一种破坏性的改变,会导致许多现有程序无法正常运行。另外,Optional类的方法应该允许获取null值,这也是一个考虑因素。

其次,为什么他们没有在Optional类中引入一个新的方法来抛出NullPointerException(NPE)呢?可能是因为这样会使API变得更加复杂和庞大,而没有明显的优势。如果你想确保代码不会意外返回null,仍然可以使用requireNonNull方法来对结果进行包装。

那么现在应该使用Optional还是Objects呢?如果你需要从一个方法返回的Optional中提取一个值,那么使用Optional的方法是合适的。如果你想确保方法的参数满足预设条件,而参数不应该为null,那么使用Objects类的requireXxx方法是更合适的。JDK的设计者从来没有主张使用Optional来包装一个值并检查是否为null,Optional是用于返回值的。

最后,新的方法是否使Objects比Optional更受欢迎,因为它们会立即抛出NPE,而不是在代码的其他地方?请参考前面的观点:你不会使用这些方法来完成同样的任务。

选择使用Optional还是Objects取决于你的具体需求。如果你需要处理返回值并检查是否为null,那么Optional是一个合适的选择。如果你需要确保方法的参数不为null,那么使用Objects类的方法是更合适的。无论选择哪种方式,都应根据具体情况进行判断。

0
0 Comments

Java中有两种替代方案,分别是java.util.Objects和java.util.Optional。Objects类的requireNonNullElse方法可以确保调用的结果不会为null,通常用于验证构造函数或方法的参数。而Optional类是用来表示可能缺失的值的类型,可以作为返回值使用。这两种方案适用的场景不同。

对于Optional类,它不适合用作替代if-null-check的方案。Optional的orElse和orElseGet方法是从Optional返回到可为空类型的后门,有时候我们确实希望使用null作为默认值。而Objects类的requireNonNullElse方法则更适合用于验证参数不为null的场景。

JDK开发者为什么没有更新Optional类中现有的方法呢?这可能违背了Optional的设计初衷,并且会导致向后不兼容的变化。调用orElse(null)的代码将会抛出异常。

为什么他们没有在Optional类中引入一个新的方法(如果第二个参数为null则抛出NPE)?API只有在对现有代码进行重大改进时才会进行扩展,而这里并没有看到这样的改进。在许多情况下,orElse方法的参数是由调用者专门创建的,作为空Optional的替代方案,很少需要额外的检查来验证其不为null。如果确实需要,可以调用orElse(requireNonNull(x))。

现在应该使用Optional还是Objects呢?如果你有一个变量(无论是局部变量、参数还是字段),你想确保它不为null,那就使用Objects类。如果你想返回一个可能为null的值,可以考虑将其包装在Optional中。对于创建Optional对象并在同一链的末尾解包的代码,要保持警惕。

新的方法是否使得Objects比Optional更可取,因为它们会立即抛出NPE,而不是像Optional一样在代码的其他地方?正如前面所述,它们适用于不同的用例。但无论如何,确保在代码中检查你期望的nullability属性(可以为null或不为null)。不要返回你认为不会为null的东西,但实际上却是null,因为你没有检查。如果发生这种情况,这不是Optional的错误。

如果有一个类似于legacy code的代码:

String str = null;
String result = str == null ? "other string" : str;

可以使用Objects类的requireNonNullElse方法来替代,代码如下:

String result = Objects.requireNonNullElse(str, "other string");

记得接受一个回答,如果你的问题得到了满意的解答。

0