gpt4 book ai didi

java - 在不使用反射的情况下使用相同的 getters 泛化第三方类

转载 作者:行者123 更新时间:2023-11-29 08:40:25 25 4
gpt4 key购买 nike

这是一个示例代码:

class A {
private Header header;
private Data data;
}

class B {
private Header header;
private Data data;
}

class C {
private Header header;
private Data data;
}


class G {
private Class messageType;
private Header header;
private Data data;

public G(Object message) {
messageType = message.getClass();
if (message instanceof A) {
header = ((A) message).getHeader();
data = ((A) message).getData();
} else if (message instanceof B) {
header = ((B) message).getHeader();
data = ((B) message).getData();
} else if (message instanceof C) {
header = ((C) message).getHeader();
data = ((C) message).getData();
}
}
}

模型类 ABC 不能更改,因为它们来自各种库(请注意,属性只是简化的)。因此,当我收到这些实例时,我想以通用方式处理它们,这就是我创建 G 模型类的原因。有没有一种方法可以将属性分配给 G 实例,而不会将 GABC 不使用反射?这不是一个选择,因为它真的很慢。 Java 8 解决方案没问题。

最佳答案

单一职责原则:G是消息,不是消息工厂:

class G {
private Class messageType;
private Header header;
private Data data;

public G(Class<?> klass, Header header, Data data) {
this.messageType = klass;
this.header = header;
this.data = data;
}
}

class GFactory {
private Map<Class<?>, Function<Object, G>> mappings;

public <T> void register(
Class<T> klass,
Function<T, Header> headerExtractor,
Function<T, Data> dataExtractor) {
Function<Object, T> cast = klass::cast;
mappings.put(klass, cast.andThen(t ->
new G(klass, headerExtractor.apply(t), dataExtractor.apply(t))));
}

public G createG(Object message) {
return mappings.get(message.getClass()).apply(message);
}

private GFactory() {
register(A.class, A::getHeader, A::getData);
}
}

我还想说不要从内部初始化 GFactory,而是从外部进行。

关于java - 在不使用反射的情况下使用相同的 getters 泛化第三方类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40652070/

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