私が達成しようとしていることについての少しの背景:
JSON (15GB 以上) を解析していますが、それをメモリに保存する必要があるため、ラッパーや余分なデータは歓迎されません。その中で使用されるフレームワークとインターフェイスのために、名前でフィールドにアクセスする機能を提供する必要があります。一部の String を Enum に、Integer を int に、Double を double になどに置き換えることで、(Jackson と比較して) メモリ フットプリントの約 90% を削減できます。
Javaの実行時に名前でフィールドに効率的にアクセスしたいと考えています。私はリフレクションを認識していますが、私の場合、そのパフォーマンスは単に受け入れられないため、使用したくありません。
問題の解決が容易になる場合は、フィールド値の設定についてあまり気にしません。また、コンパイル時に、サポートされているフィールドの名前も知っています。
ボックス化されたオブジェクトのメモリフットプリントのために、すべてをマップに保存したくありませんMap<String,Object>
が、それらをボックス化された形式で返すことは気にしません。
この問題は他の人が遭遇したと確信しており、賢い解決策に興味があります-大量の if ... else ... ステートメントよりも賢いです。
実装するインターフェースは次のとおりです。
public interface Accessor {
Object get(String fieldName);
}
get によって返される値はObject
、enum を含む任意の型にすることができます。単純な実装は次のようになります。
public class TestObject implements Accessor {
public enum MyEnum {ONE, TWO, THREE};
private final MyEnum myEnum;
private final int myInt;
private final double myDouble;
private final String myString;
public TestObject(MyEnum myEnum, int myInt, double myDouble, String myString) {
this.myEnum = myEnum;
this.myInt = myInt;
this.myDouble = myDouble;
this.myString = myString;
}
@Override
public Object get(String fieldName) {
if ("myEnum".equals(fieldName)) {
return myEnum;
} else if ("myInt".equals(fieldName)) {
return myInt;
} else if ("myDouble".equals(fieldName)) {
return myDouble;
} else if ("myString".equals(fieldName)) {
return myString;
} else {
throw new UnsupportedOperationException(); // Or could simply return null
}
}
}