2015-09-15 18 views
6

Supplierを使用して、ゲッターメソッドへの参照を格納できる列挙体ですか?ゲッター付きの列挙型

String value = myEnum.getValue(object) 

私はエラーをコンパイルせずにそれを記述する方法を見つけ出すことはできません:そのような使用することが

。私は右のあなたを取得する場合

+0

なぜない 'のvalueOf()':

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); } } 

使い方は同じである。この場合、私の代わりに列挙型の定義済みのインスタンスと通常のクラスを使用することをお勧めしたいですか? 'String result = myEnum.valueOf(object); ' –

+0

別のオブジェクトのゲッターへの参照を保存したいと思います。 –

+2

確かに、できます。 'enum'値はJavaオブジェクトなので、通常のオブジェクトでできること全てを保持できます。しかし、インスタンスにバインドされたgetterについて話している場合、推奨されるコードスタイルやおそらくXY問題のようには聞こえません。 – Holger

答えて

5

それは非常に難しいことではありません。以下の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 

他の種類。

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

あなたはこのような何かをしたい:すべてのゲッターの戻り値の型が同じであれば

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; 
    } 
}