如何告诉程序向对象添加一个新字段?

qyyhg6bp  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(408)

所以我有一个我正在做的小项目,它基本上要求程序从一个文本文件中读取信息并将其添加到对象中。但是,我希望程序添加一个新的领域,如果它发现一个新的领域是不可用的编程。

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

假设现在这是我的对象,我从文本文件输入的信息如下:name=john 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;
    }
}

然后我就可以打电话了?

jfewjypa

jfewjypa1#

不能两全其美:java是一种静态编译语言。类的字段是“静态”的。不能在运行时以编程方式添加新字段。您可以使用反射动态地显示存在哪些字段,并填充字段内容。这就是所有xml/jsonMap器为您所做的:读取xml/json内容并将值推入java对象示例,或者反过来:从那里获取数据,并将其转换为xml/json文件。
因此,如果您打算使用实字段,那么就没有“稍后添加内容”。你必须预先设计哪些字段应该在那里。所以,最坏的情况是,您定义了所有可能的选项,并允许许多字段为null/空。这是个坏主意,因为它使得处理相应的对象非常容易出错。
或者,如果通过名称进行“动态”寻址是您最重要的要求,那么只需更改为使用一个字段,这恰好是一个Map,如:

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

但当然,这会剥夺使用“编译时”字段提供的所有优势。正如另一个答案所暗示的,使用这种Map的一种方法是使用标准java属性支持的方面。

iih3973s

iih3973s2#

一种方法是使用propertiesbag。它是一个属性对象,您可以添加新的键并为它们赋值。你可以把它作为你的会员 Person 问题中的类。然后需要为属性实现getter和setter,类似于 Properties 班级。所以,如果你对你的属性是一个非常简单的类型(字符串或任何可以从字符串示例化的东西)没意见,你应该没事。
在这里您可以找到一些使用属性的示例

相关问题