gpt4 book ai didi

Java8 : how to call method for a passed type

转载 作者:行者123 更新时间:2023-11-29 04:20:41 24 4
gpt4 key购买 nike

我正在尝试实现装饰器模式,我的问题是我有不同的生成源将传递给装饰掩蔽器,我没有公共(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com