像上面这样的可能吗?
不。
使用您定义的属性,您唯一的选择是:
如果您想要动态属性,请使用Map
对象;例如一个HashMap<String, String>
。
至于您的说明性示例,那将不起作用/不起作用,因为:
- 常规对象字段不能像数组一样被索引,并且
- 与 C++、Python 和其他语言不同,Java 不支持任何核心语言结构(方法除外)的临时重载。
Java 不是支持这种东西的动态语言。你需要学会接受它可以为你提供的东西......或者使用不同的语言。
你是这样评论的:
反射应该对性能不利。
嗯,是的,但它是相对的。反射性地访问或更新字段可能比使用普通 Java 代码访问/更新它慢 10 到 100 倍。但是,如果您只是偶尔这样做,则性能开销可能无关紧要。如果它确实是一个问题,那么您的选择包括手写或生成代码。例如:
public class Foo
{
public String bar;
public String baz;
public void setNamedProperty(String name, String value) {
switch (name) {
case "bar":
bar = value;
break;
case "baz":
baz = value;
break;
default:
throw new IllegalArgumentException("Unknown property name");
}
}
}
就其价值而言,该代码将与在支持动态属性的语言中设置动态属性一样节省时间。(而且我怀疑它会更节省空间,因为动态属性通常是使用本机编码的哈希表实现的。)