关于我要实现的目标的一点背景:
我正在解析 JSON(超过 15GB),我必须将其存储在内存中,因此不欢迎任何包装器和额外数据,由于其中使用的框架和接口,我必须提供按名称访问字段的功能。通过用 Enum 替换一些 String,用 int 替换 Integer,用 double 替换 Double 等。我能够减少大约 90% 的内存占用(与 Jackson 相比)。
我希望在运行时通过它们的名称有效地访问 Java 中的字段。我知道反射,但就我而言,它的性能根本无法接受,所以我不想使用它。
如果它使问题更容易解决,我不会太在意设置字段值。我在编译时也知道支持字段的名称。
由于盒装对象的内存占用,我不想将所有内容存储在地图Map<String,Object>
中,但我不介意以盒装形式返回它们。
我确信其他人也遇到过这个问题,我对任何聪明的解决方案都很感兴趣——比大量的 if ... else ... 语句更聪明。
假设要实现的接口是:
public interface Accessor {
Object get(String fieldName);
}
get 返回的Object
可以是任何类型,包括枚举。一个天真的实现是:
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
}
}
}