说我有一个这样的课程:
public final class Identity {
private String name;
private String nin;
private int age;
}
我想获取该类中的字段的值,其中的getters是私有的。到目前为止,除了创建通用的 Object [] 数组并将每个字段的值存储在其中外,我没有提出其他解决方案。像这样:
public Object[] getFields() {
fields = new Object[]{getName(), getNin(), getAge()};
return(fields);
}
这实际上是一个不好的解决方案吗?我读过,类型转换通常是编程不好的标志,我可能应该重新考虑我的策略,但是我没有看到任何潜在的缺点,因为:我确切地知道班上有多少个字段,我确切地知道在哪个位置它们将位于数组内部,我完全知道它们每个的数据类型。例如,如果我想访问字段 age ,我知道它将位于数组( Object [2] )的位置2,并且知道将会是 int 类型,因此我将其强制转换为 int 。
我欢迎任何想法。
注意:我要提到的是,该方法的setter和getter不必被另一个干扰类访问,因此为什么要将它们声明为私有。此外,在我的程序中,该类正在实现这样的接口:
public interface Attribute {
// Fills the fields of the class with the data the user wants to.
void fill ( );
void view ( );
// Edits one or more of the fields of the class with the data the user wants to.
void edit ( );
String toString ( );
}
如您所见,其中没有定义任何setter和getter。当然,如果可以接受 getFields()方法,那么该方法通常在接口中声明。
答案 0 :(得分:0)
无论它是否是最佳设计,似乎都可以使用反射:
import java.lang.reflect.Field;
public MyClass {
String getName(Identity identity) {
return getStringFieldValue(identity, "name");
}
String getNin(Identity identity) {
return getStringFieldValue(identity, "nin");
}
int getAge(Identity identity) {
return getIntFieldValue(identity, "age");
}
String getStringFieldValue(Identity identity, String fieldName) {
try {
Field field = identity.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return (String) field.get(identity);
} catch (NoSuchFieldException e) {
return "";
} catch (IllegalAccessException e) {
return "";
}
}
int getIntFieldValue(Identity identity, String fieldName) {
try {
Field field = identity.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return (int) field.get(identity);
} catch (NoSuchFieldException e) {
return -1;
} catch (IllegalAccessException e) {
return -1;
}
}
}
答案 1 :(得分:-1)
我认为我已经把这个问题搁置了足够长时间。事实证明,正如@shmosel所指出的那样,答案简直是微不足道的。我需要做的就是将类的获取者设置为公共(设置者仍将保持私有状态,即我希望该类中的字段可见,但任何不相关的类都不能修改),然后进行强制转换班级。像这样:
Identity identity = (Identity) attribute;
String name = identity.getName();
String nin = identity.getNin();
int age = identity.getAge();
就是这样。就像我说的那样琐碎。