基于字符串的正确 getter 的性能选择
Performant selection of correct getter based on a string
我有一个 list
字符串,它们与要检索的特定值相关(例如 volume
、weight
、...)。我从通过 HTTP API 端点收到的查询中收到此列表。
还有一个class,它不仅存储了volume
和weight
,还存储了size
和time
。 class 具有所有这些字段的吸气剂。
我正在寻找一种 generic 方法来根据 list
.
中的字符串收集值
到目前为止,我做了:
public double getValue(String fieldName) {
switch(fieldName) {
case "volume":
return getVolume();
case "weight":
return getWeight();
case "size":
return getSize();
case "time":
return getTime();
default:
throw new IllegalArgumentException("error");
}
是否有更好的方法动态地 return 给定字符串的值?性能至关重要,因为这种泛型方法的调用频率很高。
您可以将值放入地图中:
Map<String, Double> fieldValues = new HashMap<>();
fieldValues.put("volume", getVolume());
fieldValues.put("weight", getWeight());
fieldValues.put("size", getSize());
fieldValues.put("time", getTime());
然后通过 id 检索它们:
public double getValue(String fieldName) {
return fieldValues.get(fieldName);
}
如果值发生变化 Jon 建议的更好方法是使用供应商:
Map<String, Supplier<Double>> fieldValues = new HashMap<>();
fieldValues.put("volume", () -> getVolume());
fieldValues.put("weight", () -> getWeight());
fieldValues.put("size", () -> getSize());
fieldValues.put("time", () -> getTime());
public double getValue(String fieldName) {
if (!fieldValues.containsKey(fieldName)) {
throw new IllegalArgumentException("error");
}
return fieldValues.get(fieldName).get();
}
I am looking for a generic method to collect a value based on the string in the list
.
似乎应该在某些接口中提取方法 double getValue(String name)
,并且 类 应该相应地实现该接口:
interface ValueFinder {
double getValue(String name);
}
class Foo implements ValueFinder {
private double volume, weight;
// getters
@Override
public double getValue(String name) {
if ("volume".equals(name)) { // or equalsIgnoreCase is possible
return volume;
} else if ("weight".equals(name)) {
return weight;
}
throw new InvalidArgumentException("Field name not found: " + name);
}
}
class Bar extends Foo {
private double size, time;
// getters
@Override
public double getValue(String name) {
if ("size".equals(name)) {
return size;
} else if ("time".equals(name)) {
return time;
}
return super.getValue(name);
}
}
我有一个 list
字符串,它们与要检索的特定值相关(例如 volume
、weight
、...)。我从通过 HTTP API 端点收到的查询中收到此列表。
还有一个class,它不仅存储了volume
和weight
,还存储了size
和time
。 class 具有所有这些字段的吸气剂。
我正在寻找一种 generic 方法来根据 list
.
到目前为止,我做了:
public double getValue(String fieldName) {
switch(fieldName) {
case "volume":
return getVolume();
case "weight":
return getWeight();
case "size":
return getSize();
case "time":
return getTime();
default:
throw new IllegalArgumentException("error");
}
是否有更好的方法动态地 return 给定字符串的值?性能至关重要,因为这种泛型方法的调用频率很高。
您可以将值放入地图中:
Map<String, Double> fieldValues = new HashMap<>();
fieldValues.put("volume", getVolume());
fieldValues.put("weight", getWeight());
fieldValues.put("size", getSize());
fieldValues.put("time", getTime());
然后通过 id 检索它们:
public double getValue(String fieldName) {
return fieldValues.get(fieldName);
}
如果值发生变化 Jon 建议的更好方法是使用供应商:
Map<String, Supplier<Double>> fieldValues = new HashMap<>();
fieldValues.put("volume", () -> getVolume());
fieldValues.put("weight", () -> getWeight());
fieldValues.put("size", () -> getSize());
fieldValues.put("time", () -> getTime());
public double getValue(String fieldName) {
if (!fieldValues.containsKey(fieldName)) {
throw new IllegalArgumentException("error");
}
return fieldValues.get(fieldName).get();
}
I am looking for a generic method to collect a value based on the string in the
list
.
似乎应该在某些接口中提取方法 double getValue(String name)
,并且 类 应该相应地实现该接口:
interface ValueFinder {
double getValue(String name);
}
class Foo implements ValueFinder {
private double volume, weight;
// getters
@Override
public double getValue(String name) {
if ("volume".equals(name)) { // or equalsIgnoreCase is possible
return volume;
} else if ("weight".equals(name)) {
return weight;
}
throw new InvalidArgumentException("Field name not found: " + name);
}
}
class Bar extends Foo {
private double size, time;
// getters
@Override
public double getValue(String name) {
if ("size".equals(name)) {
return size;
} else if ("time".equals(name)) {
return time;
}
return super.getValue(name);
}
}