我有一个课程,其中包含以下内容:
final class Attributes {
Attribute agility;
Attribute endurance;
Attribute intelligence;
Attribute intuition;
Attribute luck;
Attribute speed;
Attribute strength;
private ArrayList<Attribute> attributes;
private boolean initialized = false;
public Attributes() throws IllegalAccessException {
initializeAttributes();
store();
}
public ArrayList<Attribute> getAttributes() {
return attributes;
}
private void initializeAttributes() {
if (!initialized) {
agility = new Agility();
endurance = new Endurance();
intelligence = new Intelligence();
intuition = new Intuition();
luck = new Luck();
speed = new Speed();
strength = new Strength();
initialized = true;
}
}
private void store() throws IllegalAccessException {
Field[] fields = this.getClass().getDeclaredFields();
attributes = new ArrayList<Attribute>();
if (initialized) {
for (Field f : fields) {
if (f.getType() == Attribute.class) {
attributes.add((Attribute)f.get(this));
}
}
}
}
我的想法是以某种方式使用这样的方法:
public void setAttribute(Class attribute.getClass(), int value) {
}
在此方法中,调用者将指定要更改的属性类型(例如强度,智能等),并且进程将通过上面列出的属性的向量数组来确定要操作的属性,识别传递的属性子类是否等于上述向量中的子类。如果是这种情况,则会更改向量中的子类。
这可能吗?我问这个的主要原因是因为我不确定obj.getClass()/ getType()== obj2.getClass()/ getType()是否也会考虑子类。
答案 0 :(得分:2)
是的,你可以做到。 obj.getClass()将返回obj的确切类,无论你声明哪种类型的obj。 我建议你不要在有可能的地方使用反射。您可以使用枚举替换属性继承:
enum Attribute {
STREGTH, AGILITY, SPEED, ...;
}
有类似的东西:
public final class Attributes {
private Map<Attribute, Integer> attributes = new EnumMap(Attribute.class);
private void initializeAttributes() {
if (!initialized) {
for(Attribute att : Attribute.values()) {
attributes.put(att, 0);
}
initialized = true;
}
}
public void setAttribute(Attribute attribute, int value) {
attributes.put(attribute, value);
}
}
答案 1 :(得分:0)
您基本上寻找的是Class.isAssignableFrom(...)。它将检查当前类是否相同,或者是给定类的as参数的超类。
您只需遍历数组并删除重复的属性并将新属性添加到其中。