&#34;可选<buttontype> .get()&#34;之间的区别和&#34; alert.getResult()&#34;

时间:2015-08-08 22:37:39

标签: java javafx javafx-8

我正在摆弄JavaFX并进入一个网页,其中列出了所有不同类型的对话框,以及使用的内容的创建者:

Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Confirmation Dialog");
alert.setHeaderText("Look, a Confirmation Dialog");
alert.setContentText("Are you ok with this?");

Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){
    // ... user chose OK
} else {
    // ... user chose CANCEL or closed the dialog
}

我所做的是以下内容:

alert.showAndWait();
if (alert.getResult() == ButtonType.OK)
{
    //User chose OK
} 

else
{
    //User chose other
}

我阅读了大多数这些方法和类的文档,我可以从中收集的是,如果方法Optional返回showAndWait(),他会使用null。根据文档,showAndWait()方法会返回Optional.ofNullablenull可能是也可能不是Optional<ButtonType>。然后在if语句中,他从showAndWait()获得结果,其中包含返回的Alert并将其进行比较。

在我的部分代码中,我直接从getResult()实例获取showAndWait()的结果并对其进行比较,这可能是错误的,因为showAndWait()可能会返回null。

这是主要区别吗?防止null?或者还有另一个原因,为什么使用Optional可能比其他更好?只是想知道是否有人可以更好地解释这一点。

额外:如果有人能告诉我Optional<R>的返回类型是什么意思,它会返回:E,我将非常感激。我假设它是一种通用类型,但我以前从未见过,我只看到T N c.moveToNext()等。< / p>

感谢您对此提出任何意见。

1 个答案:

答案 0 :(得分:3)

这是主要区别吗?

没有。请参阅Dialog

的javadoc中的以下评论
  

下面显示的是三个代码段,显示了三种同样有效的方式   显示对话框:
  选项1:“传统”方法

 Optional<ButtonType> result = dialog.showAndWait();
 if (result.isPresent() && result.get() == ButtonType.OK) {
     formatSystem();
 }
     

选项2:传统+可选方法

 dialog.showAndWait().ifPresent(response -> {
     if (response == ButtonType.OK) {
         formatSystem();
     }
 });
     

选项3:完全lambda方法

 dialog.showAndWait()
      .filter(response -> response == ButtonType.OK)
      .ifPresent(response -> formatSystem());
     

上面列出的三个选项没有更好或更差的选择,所以   鼓励开发人员根据自己的风格偏好进行工作。该   显示上述目的是为了帮助介绍开发人员   可选API,它是Java 8中的新增功能,对许多人来说可能是陌生的   开发者。

防止null?

使用isPresent()ifPresent()的所有选项都存在保护。

还是有另一个原因可以解释为什么使用Optional会比其他更好?

没理由。 {8}引入了Java 8 - Oracle的人希望开发人员尽快熟悉它。虽然使用第三方API已将相同的功能引入“Java World”,但现在它已成为JDK本身的一部分。您可以在在线博客上阅读其优势等,例如Optional

如果有人能告诉我showAndWait()的返回类型是什么,我会非常感激,它会返回:Optional<R>

R类型参数(或类型变量),其中“R”代表“ R esult”。它可以是任何(XRERezult等),它们不会与类路径中的保留Java关键字或类名冲突;通常它按照惯例是单个大写字母:

Tired of Null Pointer Exceptions?

  

类型参数命名约定

     

按照惯例,类型参数名称是单个大写字母。这与您已经了解的变量Java Tutorials > Generics > Generic Types:约定形成鲜明对比,并且有充分的理由:如果没有这种约定,就很难区分类型变量和普通类或接口名称。< / p>      

最常用的类型参数名称是:

     
      
  • E - Element(Java Collections Framework广泛使用)
  •   
  • K - Key
  •   
  • N - 数字
  •   
  • T - Type
  •   
  • V - 值
  •   
  • S,U,V等 - 第2,第3,第4类
  •   
     

您将在整个Java SE API和本课程的其余部分中看到这些名称。