Доступ к полям класса, геттеры которого являются частными - PullRequest
0 голосов
/ 30 октября 2018

Скажите, что у меня есть такой класс:

public final class Identity {

    private String name;
    private String nin;
    private int age;

}

Я хочу получить значения полей в этом классе, из которых геттеры являются частными. До сих пор я не нашел другого решения, кроме как создать общий массив Object [] и сохранить значения каждого из полей в нем. Как это:

public Object[] getFields() {
    fields = new Object[]{getName(), getNin(), getAge()};
    return(fields);
}

Это действительно плохое решение? Я читал, что приведение типов обычно является признаком плохого программирования, и что мне, вероятно, следует переосмыслить свою стратегию, но я не вижу потенциальных недостатков, потому что: я точно знаю, сколько полей в моем классе, я точно знаю, в какой позиции они будут внутри массива, и я точно знаю тип данных каждого из них. Например, если я хочу получить доступ к полю age , я знаю, что оно будет на позиции 2 моего массива ( Object [2] ), и я знаю, что оно будет типа int , поэтому мне придется разыграть его как int .

Я приветствую любые идеи.

Примечание: я должен упомянуть, что требуется, чтобы к установщикам и получателям метода не обращался другой мешающий класс, поэтому они и объявлены как частные. Кроме того, в моей программе класс реализует такой интерфейс, как этот:

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

}

Который, как вы можете видеть, не имеет заданных и получающих сеттеров. getFields () метод обычно объявляется в интерфейсе, если он, конечно, считается не таким уж плохим решением.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Я думаю, что оставил этот вопрос открытым достаточно долго. Оказывается, как заметил @shmosel, ответ был невероятно тривиальным. Все, что мне нужно было сделать, это установить методы получения класса как общедоступные (методы установки будут по-прежнему оставаться закрытыми, идея заключается в том, чтобы я хотел, чтобы поля внутри класса были видимыми, но не могли изменяться любым не связанным классом) и выполнял приведение к класс. Как это:

Identity identity = (Identity) attribute;
String name = identity.getName();
String nin = identity.getNin();
int age = identity.getAge();

Вот и все. Как я уже сказал, довольно тривиальные вещи.

0 голосов
/ 30 октября 2018

Независимо от того, лучший это дизайн или нет, кажется, вы могли бы использовать отражение:

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;
       }
    }
}
...