考虑以下 java 中的代码示例:
public class Packet {
protected int offset = 0;
public int type;
public Packet() {
// This is the backward out-constructor. Every sub class must call its superior classes .new () to live!
offset++; // For type
}
int[] compile(int[] outBuffer) {
// This is the top-down compilation routine. Every sub class should call its superior compile() in a similar manner, as recursion is only possible this way!
int dOffset = offset;
outBuffer[--offset] = this.type;
int[] result = outBuffer;
offset = dOffset;
return result;
}
public class Command {
public int opCode;
public int length;
public Command() {
// OpCode and length are set by sub-classes!
type = 0x01;
offset += 3;
length = 0; // Init only
}
int[] compile(int[] outBuffer) {
int dOffset = offset;
offset -= 3;
outBuffer[offset] = opCode & 0xFF;
outBuffer[offset + 1] = (opCode >>> 8) & 0xFF;
outBuffer[offset + 2] = length;
int[] result = Packet.this.compile(outBuffer);
offset = dOffset;
return result;
}
public class HWCommand {
// And so on... 8 more nesting levels in my project
}
}
public Packet(int[] data) {
// This is the forward in-constructor.
if (data.length > 0) {
type = data[offset++];
}
}
public class Event {
// ...
}
}
我目前正在使用这样的结构,它有大约 9 到 10 级这种嵌套来解码一个可笑的复杂协议的数据包,我对此没有任何影响,对此我深表遗憾。到目前为止它运行良好,目前只有我的任务是使其适应某种架构。
有时,当通过该协议连接的另一端的计算机尚未准备好接收新的命令数据包时,因为它仍在忙于处理最后一个命令数据包,因为纯粹的处理是如此痛苦,它会拒绝我的数据包并通知我使用 OpCode 和一些相当不相关的属性。
正确的反应方法是等待随机时间并重试发送该命令。
现在,当我只有一个 Packet.Command.HWCommand 实例时,我想要一种访问例如 Packet.Command 的 OpCode 变量的方法。... .子类 sp; - 所以我可以有一个带有 OpCodes 和 Comands 的关联 HashMap,只需抓住那些没有通过成功消息确认的那些,然后重新发送它们。
我已经考虑过:
- 实现 getter 和 setter(对我来说似乎不是一个好主意)
- 保留对从中实例化 SubClass 的 Packet.Command 的引用(可以正常工作,但需要更改 10k+ 行代码,因为那些发送例程被大量使用)
- 泄漏 this$0 参考。通过 getter(例如创建一个 parent() 函数)
- 保存最后发送的数据包的原始数据,将其重新解析为那个海量的协议数据结构,然后重新发送(似乎……对我来说有点奇怪)
其中哪一个是最好的方法,或者我不知道有更好的方法吗?