【问题标题】:Avoiding if/else statements in JavaFX [closed]避免在 JavaFX 中使用 if/else 语句 [关闭]
【发布时间】:2022-01-21 10:56:35
【问题描述】:

AFAIK 我应该尽可能避免使用 if/else 语句。

我选择了这种方法,我正在寻找它是否有效。

FXMLLoader fxmlLoader = new FXMLLoader(HelloController.class.getResource("UserPanel.fxml"));
if(receivedJSON.get("isAdmin").toString().equals("1")) {
    fxmlLoader = new FXMLLoader(HelloController.class.getResource("AdminPanel.fxml"));
}

//....
//....
//code that needs to be run so I can't return in the if statement
//....

我不是很喜欢,因为如果isAdmin 属性为1,我必须做两个分配。

在这种情况下,避免 if/else 的最佳和专业方法是什么?

谢谢!

【问题讨论】:

  • 还有...为什么要避免使用 if-else 语句?
  • @Stultuske 的好习惯,据我所知
  • OK.. 请允许我改述一下。是什么让您认为这是一种好的做法?
  • 专业的方式是避免过早的微优化 :) 你的 sn-p 看起来像次优的逻辑/类结构(f.i. 如果你替换为用户实例化一个加载器它与管理员的加载程序基于您在创建之前似乎知道的条件)。
  • 它已经关闭,所以我无法回答,但是,我会这样写:创建一个方法boolean isAdmin(JsonObject json) { return json.get("isAdmin").toString().equals("1"); } 创建一个方法Parent loadView(String viewName) { \* create a loader, load the viewName fxml and return the parent *\ },然后我会写Parent view = isAdmin(receivedJSON) ? loadView("AdminPanel") : loadView("UserPanel" );` 然后继续你的“需要运行的代码”。

标签: java javafx


【解决方案1】:

本指南尽可能不使用if,仅适用于优化每秒执行数百万次的代码。每次运行程序时,您可能只创建非常少量的 FXMLLoader。 即使您估计大量丢失了 40 个 CPU 周期,在 4 Ghz 上,在失败的分支上仍然只有 10 纳秒,所以您无需担心。

事实上,即使你只花 1 分钟写这篇文章,并且你创建了 100 个 FXMLLoader(总共 1 微秒),并且分支预测器连续失败 100 次(不会发生),仍然需要 60写这篇文章的时间是理论上可以节省的时间的一百万倍。

或者如果你创建一个服务器程序,你只需要 1 分钟来优化它,它每秒在 if 语句中创建一个 FXMLLoader,并且每次分支预测都失败,那么该服务器需要连续运行 190 年即使您将服务器单核 CPU 时间视为与开发人员时间相同的方式,也是值得的。

【讨论】:

  • 此外,您可能会使用每个 FXMLLoader 来解析 FXML 文件并从中创建一堆 UI 对象。这是一个昂贵的过程,而且执行足够多的时间来从“避免if”中节省(如果确实有的话)是不可行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
相关资源
最近更新 更多