gpt4 book ai didi

java - 当简单地传递值和(不同的)关联属性时,Java 中的标记类是否可以接受?

转载 作者:太空宇宙 更新时间:2023-11-04 15:13:37 25 4
gpt4 key购买 nike

我有一个代表网络 session 的对象,其中包含要执行的操作列表 - 例如,它可以发送消息、接收消息、暂停、接收消息和接收消息。操作有一些与之相关的额外数据 - 例如,当接收消息时,您有一个与之匹配的正则表达式,而当发送消息时,您只有文字消息以及是否重新传输。

我希望 session 对象能够处理消息的实际接收或发送 - 这些消息依赖于 session 对象中包含的状态(要填写的字段、失败时要做什么等),我认为它更干净让 session 根据当前操作执行此操作,而不是将其委托(delegate)给操作并将其所有状态传递给操作。

本能地,我有一个 Action 类,其中有一个字段指示其类型(发送/接收/暂停)和一些其他字段,并非所有这些字段都会用于给定类型(要发送的消息/正则表达式以匹配/暂停持续时间)。但我一直在阅读Effective Java,其中说using a "tagged class" like this is bad and is better done with inheritance 。不过,我不太确定如何实现这一点 - 如果我有一个 RecvAction、SendAction 和 PauseAction 子类,我认为我的 session 对象必须执行一个 instanceof 检查才能找出正确的行为,我的印象是instanceof 检查有点代码味道。

就良好的 Java 风格而言,解决这个问题的正确方法是什么?如果我有一个值对象传达一条主要信息(发送消息)和相关的次要信息(发送什么消息),那么这是一个合法的异常(exception),我可以使用标记类,或者是否有更干净的方法来解决这个问题?

最佳答案

如果您需要这种灵 active ,您可以丢弃标签,并允许操作只是可以被伴随的处理器捕获的普通对象。例如。 Processor 的列表具有方法的类 boolean supports(Action action)void handle(Action action) 。您还需要一个编排器,它可以保存任意处理器列表,对于收到的消息,将询问处理器是否支持它,并回答 true 。上supports(Action action) ,将得到handle(Action action)分别调用。

例如

public interface Processor<A extends Action> {
boolean <T extends A> supports(T action);
void handle(A action);
}

public ActionRouter {
private List<Processor> processors = new LinkedList<Processor>();
public void handle(Action a) {
for (Processor p : processors) {
if (p.supports(a)) {
p.handle(a);
return;
}
}
}
}

通过这种方式,您可以达到可接受的内聚水平,例如通过实现集中的 Action 处理器,例如 SendActionProcessor implements Processor<SendAction>

是的,instanceof看起来不是很优雅,但是达到目的还可以忍受。如果您不喜欢它并且不想重复自己,请实现一个抽象处理器类,该类会将所需的类型作为构造函数参数,并将按类型封装接受。

另一方面,情况并不总是 instanceof测试。您的handle方法将充当谓词,并且可以在决定处理操作之前测试操作的状态。确实,取决于您需要什么。

关于java - 当简单地传递值和(不同的)关联属性时,Java 中的标记类是否可以接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21078132/

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