簡體   English   中英

使用非靜態方法作為泛型枚舉屬性

[英]Using Non-Static Methods as Enum Properties with Generics

我會盡量保持簡短。 我正在嘗試做這樣的事情:

public enum Fruit {
    APPLE("Apple", appleHelper::doAppleThing),
    ORANGE("Orange", orangeHelper::doOrangeThing);

    private String name;
    private Function<String, List<T>> fruitFunction;

    Fruit(String name, Function<String, List<T>> fruitFunction) {
      this.name = name;
      this.fruitFunction = fruitFunction;
    }

    public String getName() {
      return name;
    }

    public <T> List<T> applyFruitFunction(String someString) {
      return fruitFunction.apply(someString);
    }
}

這樣以后我可以有一個類似的方法

private <T> List<T> doFruitThing(String someString, Fruit fruit) {
    List<T> transformedFruits = fruit.applyFruitFunction(someString);

    if (transformedFruits.isEmpty()) {
        throw new FruitException("There was no fruit of type " + fruit.getName());
    }

    return transformedFruits;
}

我在這里遇到兩個問題。

  1. doAppleThingdoOrangeThing不是靜態方法,理想情況下會保持這種狀態,而且我找不到任何方法來創建appleHelperorangeHelper的本地實例以使方法引用起作用。
  2. 即使我將方法設為靜態,枚舉也不能具有Type參數,因此也無法將Function<String, List<T>> fruitFunction作為字段。

有辦法嗎? 還是更好的方法呢?

枚舉值可以有自己的方法實現。 所以我將其寫為:

public enum Fruit {
    APPLE("Apple") {
        private final AppleHelper helper = new AppleHelper();

        @Override
        public <T> List<T> applyFruitFunction(String someString) {
            return helper.doAppleThing(someString);
        }
    },

    ORANGE("Orange") {
        private final OrangeHelper helper = new OrangeHelper();

        @Override
        public <T> List<T> applyFruitFunction(String someString) {
            return helper.doOrangeThing(someString);
        }
    };

    private String name;

    Fruit(String name) {
      this.name = name;
    }

    public String getName() {
      return name;
    }

    public abstract <T> List<T> applyFruitFunction(String someString);
}

但是,如果要達到枚舉實例需要按實例狀態的目的,那么擁有的東西將越來越少,而枚舉又僅僅是抽象的基類。 最好是采用一種更面向對象的方法,例如使用工廠/飛輪模式,而不是將此類事情與純粹的枚舉聯系在一起。 (很難確定,因為問題中的代碼顯然只是一個簡化的示例。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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