簡體   English   中英

根據選定的枚舉值調用對象的特定方法

[英]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類,您可以使用它來進行“默認”處理。
  • 您將retrieveFieldSearchableFields枚舉一起放入類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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM