访问获取者是私有的类的字段

时间:2018-10-30 01:59:23

标签: java object getter-setter private-members

说我有一个这样的课程:

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()方法,那么该方法通常在接口中声明。

2 个答案:

答案 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();

就是这样。就像我说的那样琐碎。