[英]Call specific method on object depending on selected enum value
假設我們有一個枚舉,它代表可搜索的字段:
enum SearchableFields {
ALL,
FIELD1,
FIELD2,
FIELD3;
}
枚舉可以包含方法定義,因此一種方法是定義根據枚舉值檢索字段名稱的方法。 我假設您也將實際字段名稱存儲為成員字段。 然后您可以覆蓋特殊
ALL<\/code>值的方法:
enum SearchableFields {
ALL("all") { // all is just a placeholder in this case
@Override
String retrieveField(FieldPojo f) {
// logic for all fields
}
},
FIELD1("field1"),
FIELD2("field2"),
FIELD3("field3");
SearchableFields(String fieldName) {
this.fieldName = Optional.of(fieldName);
}
SearchableFields() {
fieldName = Optional.empty();
}
private final Optional<String> fieldName;
String retrieveField(FieldPojo f) {
if (fieldName.isPresent()) {
return (String) f.getClass().getField(fieldName.get()).get(f);
} else {
// ...
}
}
}
您可以創建靜態地圖而不是 switch-case。
private static final Map<SearchableFields,Supplier<String>> searchableFieldsToFieldPojo = Map.of(
ALL, this::retrieveAll,
FIELD1, FieldPojo::retrieveAll
);
鑒於您可以修改代碼的所有部分,您有幾個選擇:
retrieveField
放入FieldPojo
類中並修改它的參數,使其將枚舉SearchableFields
作為參數。FieldPojo
的字段作為值放入帶有SearchableFields
類型鍵的映射中。 然后,您可以決定是否要將“ALL”作為地圖的額外條目,或者在類似於retrieveField
的方法中將其作為特殊情況處理。 如果您想更新枚舉而不是FieldPojo
類,您可以使用它來進行“默認”處理。retrieveField
與SearchableFields
枚舉一起放入類FieldPojo
- 因為只有FieldPojo
知道它實際提供哪些字段作為可搜索字段。 根據您的實際需求(您只展示了它們的一個非常抽象和具體的版本),一種或另一種方法可能對您來說是“正確的”。 我實際上更喜歡“將所有內容都放入FieldPojo
”作為最強大的方法,但另一方面,如果您無法更改FieldPojo
並且必須處理許多不同的類,那么內省變體可能是正確的。 (請注意,它在安全性方面很脆弱,而且可能非常慢。)
您可以在枚舉常量中存儲對 getter 的引用:
enum SearchableFields {
ALL(FieldPojo::retrieveAll),
FIELD1(FieldPojo::getField1)
private final Function<FieldPojo, String> accessor;
SearchableFields(Function<FieldPojo, String> acccessor) {
this.accessor = accessor;
}
public String get(FieldPojo fp) {
return accessor.apply(fp);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.