Java8 : how to call method for a passed type

标签 java java-8 method-reference

我正在尝试实现装饰器模式,我的问题是我有不同的生成源将传递给装饰掩蔽器,我没有公共(public)父级公开我在每个掩蔽器中进行各种掩蔽所需的方法来解决这个问题我考虑过将类型传递给屏蔽器,每个屏蔽器都会知道他将使用的 setter/getter,现在我想做的是传递具有共同父对象(没有方法)的对象并使用传递的类型,现在我的问题是调用 getter,例如对于 NumbrMasker,我知道 getter/setter 将是 getNumber/setNumber,但我不确定如何为传递的类型调用方法。

class NumberDecoratedMasker extends Masker {

private Class classType;

public DecoratedMasker (Masker masker, Class classType) {      
       this.classType = classType;
}

//for Number masker
public void mask(ParentModel parent) {
   //cast parent using classtype
   //call getNumber/setNumber for masking number

   if(masker != null)
      makser.mask(parent); // this is the decorated call for the other masker in the decorator structure
}
}


class ParentModel {
 //has nothing
}

class Elementa extends ParentModel {
  //has setters and getters for number
}

现在我用我想屏蔽的对象的类类型初始化 Decorated

 Masker masker = new NumberDecoratedMakser(new SecondNumberDecoratedMasker(ElementA.class), ElementA.class);

ParentModel model = new ElementA();
masker.mask(moel);

我知道在这种情况下反射是一种解决方案,但我不能接受它,有没有办法用 java8 做到这一点?

最佳答案

public void mask(ParentModel parent, Supplier<ParentModel> getter,
                                     Consumer<ParentModel> setter) {
    setter.accept(parent);
    parent = getter.get();
}

使用类需要一些丑陋的东西,比如:

interface Xetter<T> {
    void set(T x);
    T get();
}

public void mask(ParentModel parent, Class<Xetter<ParentModel>> xetter) {
}

更好的方法是使用 JavaFX 中使用的 ...Property 类,例如 StringProperty .这包装了一个值类型/类并提供了您似乎正在寻找的抽象。看WritableValue .

作为最后的评论。一般来说,应该使用像这样参数化的类:

public <T> T f(Class<T> type, Object value) {
    return type.cast(value);
}

反馈后:仍然不太确定装饰是否符合预期行为。

class Value {
}

class NumberValue extends Value {
    private Number number;
    void setNumber(Number number) {
        this.number = number;
    }
    Number getNumber() {
        return number:
    }
}

class Masker {
    public void mask(Value value) {
    }
}   

要么

class NumberDecoratedMasker<T extends NumberValue> extends Masker {
    private final Masker masker;
    private final Class<T> type;

    public NumberDecoratedMasker(Masker masker, Class<T> type) {
        this.masker = masker;
        this.type = type;
    }

    //for Number masker
    public void mask(Value value) {
        //cast parent using classtype
        //call getNumber/setNumber for masking number
        NumberValue n = type.cast(value);
        n.setNumber(42 + n.getNumber);
        value = n;
        if (masker != null) {
            masker.mask(value);
        }
    }
}
Masker masker = new NumberDecoratedMasker(
    new SecondNumberDecoratedMasker<NumberValue>(NumberValue.class), NumberValue.class);

class NumberDecoratedMasker extends Masker {
    private final Masker masker;
    private final Class<NumberValue> type;

    public NumberDecoratedMasker(Masker masker, Class<NumberValue> type) {
        this.masker = masker;
        this.type = type;
    }

    //for Number masker
    public void mask(Value value) {
        //cast parent using classtype
        //call getNumber/setNumber for masking number
        NumberValue n = type.cast(value);
        n.setNumber(42 + n.getNumber);
        value = n;
        if (masker != null) {
            masker.mask(value);
        }
    }
}
Masker masker = new NumberDecoratedMasker(
    new SecondNumberDecoratedMasker(NumberValue.class), NumberValue.class);

Value model = new NumberValue();
masker.mask(model);

关于Java8 : how to call method for a passed type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49404340/

相关文章:

java - 使用java流来代替复杂的代码

java - 如何 junit 这个可观察的异步方法

java - 对本地类构造函数的方法引用

java - 为什么在 apache opennlp 1.8 中分类是 String[ ] 而不是 String?

java - JPA:可自动和手动设置的 Id 列

Java记录器: Have a different output color for each severity level

Java 8 - 与匿名类不同,不会为 lambda 创建新对象

java - 如何获取构造函数lambda的返回类型

java - 方法 unmodifiablelist() 不能应用于给定类型

java - Spring MVC Controller View