Как я могу сказать программе добавить новое поле к объекту? - PullRequest
0 голосов
/ 06 декабря 2018

Итак, у меня есть этот мини-проект, который я выполняю, и в основном он требует, чтобы программа считывала текстовый файл и добавляла информацию к объекту.Тем не менее, я хочу, чтобы программа добавила новое поле, если она находит новое поле, которое не доступно программно.

public class Person{
    public person(String name, int age){
        this.name=name;
        this.age=age;
    }  
}

Допустим, на данный момент это мой объект, и информация для моего ввода из текстового файла выглядит следующим образом: Имя = Джон Возраст = 21 lastName = Doe.(Но каждый из них будет отдельной строкой) И это было бы моим главным:

public class miniProject{
    ArrayList<String> fields= new ArrayList<String> ();
    ArrayList<String> data= new ArrayList<String> ();

    public static void main(String[] args) throws FileNOtFoundException{
        Person temp;
        File file = new File("personInfo.txt");
        Scanner in = new Scanner(file);
        while (in.hasNext()) {
            String[] info=in.nextLine().split("="); //assuming ill get ["Name","John"] for the first line
            fields.add(info[0]);
            data.add(info[1]);
        }
        for (x=0;x<field.length;x++){
            if (person.field[x]==null){ //im not really sure how id check for this
               //make new field and add info
            }else{
                person.field[x]=data[x];
            }
        }
    }
}

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

public class Person{
    public person(String name, String age){
        this.name=name;
        this.age=age;
    }
    public void newField(String field, String info){
        this.field=info;
    }
}

и тогда я могу позвонить по этому поводу?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

У вас не может быть обоих способов: Java - это статически скомпилированный язык.И поля классов являются «статичными» вещами.Вы не можете программно добавить новое поле в время выполнения .Вы можете использовать отражение, чтобы динамически определить, какие поля существуют, и заполнить содержимое поля.Это то, что все картографы XML / JSON делают для вас: читать содержимое XML / JSON и помещать значения в экземпляры объектов Java или наоборот: извлекать данные оттуда и превращать их в файлы XML / JSON.

Так что, если вы намереваетесь использовать реальные поля, тогда нет «добавления вещей позже».Вы должны заранее определить, какие поля должны быть там.Таким образом, в худшем случае вы определяете все потенциальные параметры и допускаете, чтобы многие поля были пустыми или пустыми.Что является плохой идеей, поскольку делает работу с соответствующими объектами действительно подверженной ошибкам.

В качестве альтернативы, если "динамическая" адресация с использованием имени является вашим наиболее важным требованием, просто измените на одно поле, которое, как оказалось, является картой, например:

Map<String, Object> myData = new HashMap<>();

Но, конечно, это устраняет все преимущества, которые дает использование полей из «времени компиляции».Как следует из другого ответа, один способ использования таких карт заключается в использовании аспектов поддержки стандартных свойств Java .

0 голосов
/ 06 декабря 2018

Один из способов сделать это и иметь некоторую гибкость - использовать нечто, называемое PropertiesBag.Это объект Properties , в который вы сможете добавлять новые ключи и присваивать им значения.Вы можете иметь его в качестве члена вашего Person класса в вопросе.Затем вам нужно реализовать getter и setter для свойства, аналогично классу Properties.Итак, если вы в порядке с вашими свойствами, имеющими очень простые типы (String или что-либо, что может быть создано из String), у вас все будет в порядке.

Здесь вы можете найти некоторый примерработа со свойствами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...