gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:34:12 24 4
gpt4 key购买 nike

考虑这段代码:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com