考虑这段代码:
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 种可能性。我从其他学生那里得到一些评论,说使用反射是“不好的做法”。是这样吗?为什么?
最佳答案
这是不好的做法有很多原因。其中:
- 它不够健壮。用户在文本字段中键入的文本必须与方法名称相匹配,这意味着根本不应该相关的事物之间存在可怕的耦合度
- 反射表现不佳。在这里可能没什么大不了的,但如果没有充分的理由使用反射,你不应该。
- 使用 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/