簡體   English   中英

恩格用吸氣劑

[英]Enum with a getter

枚舉是否能夠使用Supplier存儲對getter方法的引用?

這樣使用:

String value = myEnum.getValue(object)

我無法想象如何在不編譯錯誤的情況下編寫它。

如果我找到你,你想做這樣的事情:

import java.util.function.DoubleSupplier;

public class Test {

  enum MathConstants {

    PI(Test::getPi), E(Test::getE);

    private final DoubleSupplier supply;

    private MathConstants(DoubleSupplier supply) {
      this.supply = supply;
    }

    public double getValue() {
      return supply.getAsDouble();
    }
  }

  public static void main(String... args) {
    System.out.println(MathConstants.PI.getValue());
  }

  public static double getPi() {
    return Math.PI;
  }

  public static double getE() {
    return Math.E;
  }
}

如果所有getter的返回類型相同,則不是很困難。 考慮以下PoJo類:

public static class MyPoJo {
    final String foo, bar;

    public MyPoJo(String foo, String bar) {
        this.foo = foo;
        this.bar = bar;
    }

    public String getFoo() {
        return foo;
    }

    public String getBar() {
        return bar;
    }

    public int getBaz() {
        return 5;
    }
}

然后我們可能有這樣的枚舉:

public static enum Getters {
    FOO(MyPoJo::getFoo), BAR(MyPoJo::getBar);

    private final Function<MyPoJo, String> fn;

    private Getters(Function<MyPoJo, String> fn) {
        this.fn = fn;
    }

    public String getValue(MyPoJo object) {
        return fn.apply(object);
    }
}

並像這樣使用它:

System.out.println(Getters.FOO.getValue(new MyPoJo("fooValue", "barValue"))); // fooValue

但是,如果要返回不同類型,則會出現問題。 在這種情況下,我建議使用帶有預定義實例的普通類而不是枚舉:

public static final class Getters<T> {
    public static final Getters<String> FOO = new Getters<>(MyPoJo::getFoo);
    public static final Getters<String> BAR = new Getters<>(MyPoJo::getBar);
    public static final Getters<Integer> BAZ = new Getters<>(MyPoJo::getBaz);

    private final Function<MyPoJo, T> fn;

    private Getters(Function<MyPoJo, T> fn) {
        this.fn = fn;
    }

    public T getValue(MyPoJo object) {
        return fn.apply(object);
    }
}

用法是一樣的:

System.out.println(Getters.FOO.getValue(new MyPoJo("fooValue", "barValue"))); // fooValue
System.out.println(Getters.BAZ.getValue(new MyPoJo("fooValue", "barValue"))); // 5

暫無
暫無

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

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