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 と Commands に関連付けられた HashMap を使用し、成功メッセージで確認されなかったものを取得して再送信できます。
私はすでに検討しました:
- ゲッターとセッターの実装 (私には良い考えとは思えません)
- SubClass がインスタンス化された Packet.Command への参照を保持します (問題なく動作しますが、送信ルーチンが頻繁に使用されるため、10,000 行以上のコードを変更する必要があります)
- this$0 ref のリーク。ゲッターを介して (たとえば、parent() 関数を作成します)
- 送信された最後のパケットの生データを保存し、それをその大規模なプロトコルデータ構造に再解析してから再送信します(...私には少し奇妙に思えます)
それらのどれがそれを行うための最良の方法ですか、または私が気付いていないより良い方法はありますか?