gpt4 book ai didi

java - 字符串或枚举作为参数来引用模型字段

转载 作者:行者123 更新时间:2023-11-30 09:14:20 27 4
gpt4 key购买 nike

我有一个模型有 5 个带有 getter 和 setter 的字段,比如 id, name, age, dob, city

服务类包含一个方法,该方法只能以数组的形式返回特定字段数据。就像我只想要所有人的姓名和年龄。

List<Object> getEmpDataAsList(List<Object> fields);

所以我的方法看起来像这样,它需要一个参数 fields,其中包含需要返回的字段列表。因此,对于这种情况,我应该只将 nameage 发送到 fields 参数,而我的 getEmpDataAsList 检测请求的字段并相应地构建返回数组。

我想知道最好的方法是什么。我是否应该将 fields List 作为 String 传递,我目前也在这样做,例如:

List<String> fields = new ArrayList<>();
fields.add("name");
fields.add("age");

getEmpDataAsList(fields);

但我认为,这并不安全。如果有一天我打算更改一个字段的名称,或者如果我从模型中删除一个字段怎么办,那么我需要在 3 个地方进行更改。我应该在模型类中创建一个枚举并使用枚举字段来创建相同的 fields 数组并使用它吗?或者还有其他更好的方法吗?

最佳答案

What if I plan to change name of a field one day or what if I remove a field from model, then I need to make changes at 3 places.

这个问题没有解决方案。如果你删除一个字段,它就消失了。您必须将其从模型和客户端中删除。但这里有一个快速解决方案,可以使更改变得显而易见,这样更改 API 就会导致编译错误。

在抽象父类中使用泛型在编译时检查参数列表:

public abstract class GenericDataInterface<KEY extends Enum> {
public abstract Object getData(KEY key);

public final List<Object> getEmpDataAsList(List<KEY> fields) {
List<Object> result = new ArrayList<Object>(fields.size());
for (KEY field : fields) {
result.add(getData(field));
}
return result;
}
}

示例模型类:

public class Pizza extends GenericDataInterface<Pizza.PizzaAttributes> {
public enum PizzaAttributes { NAME, TOPPINGS, PRICE };

private String name;
private Set<String> toppings;
// WARNING: Do not use Float for prices in real applications!
private float price;

@Override
public Object getData(PizzaAttributes key) {
switch (key) {
case NAME:
return name;
case TOPPINGS:
return toppings;
case PRICE:
return price;
default:
throw new IllegalArgumentException(
"Key " + key + " isn't defined for " + Pizza.class.getCanonicalName());
}
}
}

结果还不是很方便,因为顺序扭曲会导致看不见的问题。因此,您可以使用 map 作为结果:

public abstract class GenericDataInterface<KEY extends Enum> {
public abstract Object getData(KEY key);

public final Map<KEY, Object> getEmpDataAsList(List<KEY> fields) {
Map<KEY, Object> result = new HashMap<KEY, Object>(fields.size());
for (KEY field : fields) {
result.put(field, getData(field));
}
return result;
}
}

除了 Map,您还可以使用真实模型类的克隆并仅填充指定的属性。

进一步的想法:

  • 你真的需要这样一个通用接口(interface)吗?
  • 如果是网络通信,难道就不能用XML或者JSON吗?

关于java - 字符串或枚举作为参数来引用模型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20565911/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com