2015-09-15 23 views
6

Bir referans, Supplier kullanarak bir getter yöntemine referanslar saklayabilir mi? Ben hataları derleme olmadan yazmayı bilemiyorumBir alıcıya sahip Enum

String value = myEnum.getValue(object) 

:

böyle kullanımı olmak. O an seni yakalarsa

+0

neden yapmıyorsun '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); } } 

Kullanımı aynıdır: Bu durumda ben yerine enum önceden tanımlanmış durumlarda normal sınıfını kullanmak öneririm? 'String result = myEnum.valueOf (object); ' –

+0

Başka bir nesnenin alıcısına bir başvuru kaydetmek istiyorum –

+2

Şüphesiz, yapabilirsiniz. "enum" değerleri, Java nesneleridir, böylece sıradan nesnelerin yapabileceği her şeyi tutabilirler. Ancak, alıcılar bir örneğe bağlı olduğundan bahsediyorsanız, önerilen kod stili ve muhtemelen bir XY sorunu gibi görünmüyor. – Holger

cevap

5

Çok zor değil.

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

Sonra böyle enum olabilir:

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

Ve bu gibi kullanmak: Aşağıdaki Pojo sınıfı düşünün

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

İade etmek istiyorsanız sorunlu olacaktır Ancak farklı şekiller.

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

böyle bir şey yapmak istiyorum: bütün alıcılar için dönüş tipi aynı ise

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