Как сохранить значения каждой переменной класса с помощью функции generi c? - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь сохранить в ArrayList все значения каждой переменной класса. Я создал эту функцию во всех имеющихся у меня классах и хочу, чтобы она делала то же самое для каждого класса (каждый класс имеет разные переменные).

Другими словами, я хочу @Override функцию toString, но не зная, сколько атрибутов имеет класс.

Это то, что я сделал до сих пор:

public class Example {

    private type1 var1 = 'Hello';
    private type2 var2 = 10;
    private type3 var3 = 'Bye';
    //...

    @Override
    public String toString() {
        ArrayList<String> fields = new ArrayList<>();

        for (Field f: this.getClass().getDeclaredFields()) {

            fields.add(f.getName());    //This does not work for what I want. This returns the name of the type of the variable and not what it is storing. What should I change it for?
        }

         return String.join(", ", fields);
     }
}

Итак, для этого примера, вывод, который я получаю:

var1, var2, var3

Но вывод, который я хочу получить:

Hello, 10, Bye

Есть ли способ сделать это?

1 Ответ

1 голос
/ 26 марта 2020

Вы можете получить значение полей следующим образом:

public class Example {

    private int var1;
    private String var2;
    private double var3;

    public Example(int var1, String var2, double var3) {
        this.var1 = var1;
        this.var2 = var2;
        this.var3 = var3;
    }

    @Override
    public String toString() {
        ArrayList<String> fields = new ArrayList<>();

        try {
            for (Field f: this.getClass().getDeclaredFields()) {
                fields.add(f.get(this).toString());
            }
        }
        catch(IllegalAccessException e) {
            return "Illegal access while generating toString";
        }

        return String.join(", ", fields);
    }
}

Должно хорошо работать с примитивными типами. Но, конечно, это может стать очень грязным (в любом случае, когда вы используете рефлексию, это немного грязно с самого начала), если вы хотите управлять сложными типами. Я действительно не знаю, чего вы хотите достичь, но убедитесь, что отражение - это ваш единственный вариант, и еще раз проверьте, что вы не изобретаете велосипед заново.

...