javafx是Java反射的坏习惯吗?
考虑这段代码:
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构造。choicebox用于让用户决定要搜索的属性,目前有6种可能性。我从其他学生那里得到一些评论,认为使用反思是“糟糕的做法”。是这样吗?为什么
# 1 楼答案
是的,反射很慢,以这种方式使用时会产生脆弱的代码
如果要避免使用If语句,应该使用多态性。使用
public void search(String query)
创建一个接口Searcher
,为每种类型的搜索创建实现,然后将每个实现的一个实例作为Map<String, Searcher>
的值,由搜索选择框的值键入因为Java枚举是对象,所以也可以使用枚举作为映射。每个枚举值将定义它们自己的
search(string)
实现。然后可以使用SearchEnumTypeName.valueOf(searchChoiceBox.getValue()).search(query)
调用所需的实现