java - Java 反射是不好的做法吗?

标签 java javafx reflection

考虑这段代码:

public void doSearch(ActionEvent event) {
    String query = searchTextField.getText();
    if (query.isEmpty()) {
        data = FXCollections.observableArrayList(dc.getJobCoachRepo().getList());
        usersTableView.setItems(data);
    } else {

        String searchOn = "search" + searchChoiceBox.getValue();
        try {
            Method m = this.getClass().getMethod(searchOn, String.class);
            m.invoke(this, query);
        } catch (Exception e) {

        }
    }
}

public void searchFirstName(String query) {
    data = FXCollections.observableArrayList(dc.getJobCoachRepo().searchFirstName(query));
    usersTableView.setItems(data);

}
...
...

我在这里使用 java 反射来避免 if 构造。选择框用于让用户决定他要搜索的属性,目前有 6 种可能性。我从其他学生那里得到一些评论,说使用反射是“不好的做法”。是这样吗?为什么?

最佳答案

这是不好的做法有很多原因。其中:

  1. 它不够健壮。用户在文本字段中键入的文本必须与方法名称相匹配,这意味着根本不应该相关的事物之间存在可怕的耦合度
  2. 反射表现不佳。在这里可能没什么大不了的,但如果没有充分的理由使用反射,你不应该。
  3. 使用 lambda 表达式有现成的更好的解决方案。

考虑用 Consumer<String> 填充您的组合框对象:

ComboBox<Consumer<String>> searchChoiceBox = new ComboBox<>();
searchChoiceBox.getItems().add(createSearchOption(this::searchFirstName, "First Name"));

// ...

private Consumer<String> createSearchOption(Consumer<String> search, String name) {
    return new Consumer<String>() {
        @Override
        public void accept(String s) {
            search.accept(s);
        }
        @Override
        public String toString() {
            return name ;
        }
    };
}

然后你就可以:

public void doSearch(ActionEvent event) {
    String query = searchTextField.getText();
    if (query.isEmpty()) {
        data = FXCollections.observableArrayList(dc.getJobCoachRepo().getList());
        usersTableView.setItems(data);
    } else {

        searchChoiceBox.getValue().accept(query);

    }
}

关于java - Java 反射是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42425906/

相关文章:

JavaFx如何使用时间轴移动窗口位置

java - 将对象拖放到舞台外的新窗口

java - 如何在JavaFx中移动工具栏中的图像

reflection - memberProperty returnType 父类(super class)的类型检查失败

java - 如何使用 ServletContextPropertyPlaceholderConfigurer 中从数据库加载的属性覆盖从文件加载的属性?

java - 如何执行Quickfix/J jar?

java - Spring3 与 Struts2 的集成

java - 使用图像 JavaFX 创建图像边框

java - 用于读取 java 文档的 lib

java - 检索 Activity 实例的 ActivityInfo