バイナリ ファイル形式のパーサーを作成しています。私が読んでいる逆シリアル化された構造を表すクラスを作成しました。そこでは、最終変数を使用して抽出されたデータを保持したいと考えています。
class MyObject {
final int my_x;
final int my_y;
final int my_z;
}
私が遭遇している問題は、特定のフィールドの存在が設定されている特定のフラグに依存することです。例えば:
MyObject(InputStream is) {
my_x = in.read();
if (my_x == 1) {
my_y = in.read();
if (my_y == 1) {
my_z = in.read();
}
}
}
ただし、my_yとmy_zが初期化されていない可能性があるため、これによりエラーが発生します。これらの条件は 5 ~ 6 レベルの深さにすることができ、ブランチ ツリーの各レベルでどのフィールドが読み取られないかを追跡したくありません。もう 1 つの問題は、特定のフラグに基づいて、トップレベルの構造と同じパターンで処理したいサブオブジェクトが存在する可能性があることです。
class MyObject {
final int my_x;
final SubObject my_subobject;
MyObject(InputStream is) {
my_x = is.read();
if (my_x == 1)
my_subobject = new SubObject(is);
}
class SubObject {
final int sub_x;
final int sub_y;
SubObject(InputStream is) {
sub_x = is.read();
if (sub_x == 1)
sub_y = is.read();
}
}
}
考えられるフラグの各組み合わせを処理するためにコードをひねらずに、フィールドを final にする方法はありますか?