基于字符串的正确 getter 的性能选择

Performant selection of correct getter based on a string

我有一个 list 字符串,它们与要检索的特定值相关(例如 volumeweight、...)。我从通过 HTTP API 端点收到的查询中收到此列表。

还有一个class,它不仅存储了volumeweight,还存储了sizetime。 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);
    }
}