繁体   English   中英

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

[英]How can i tell the program to add a new field to an object?

所以我正在做这个小型项目,它基本上需要程序从文本文件读取并将信息添加到对象。 但是,如果程序发现无法以编程方式使用的新字段,我希望程序添加一个新字段。

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

然后我可以打电话吗?

您不能同时拥有两种方式:Java是一种静态编译语言。 类的字段是“静态”的东西。 您无法在运行时以编程方式添加字段。 您可以使用反射来动态计算存在哪些字段,并填充字段内容。 那就是所有XML / JSON映射器为您完成的工作:读取XML / JSON内容并将值推入Java对象实例,或者反过来:从那里获取数据,然后将其转换为XML / JSON文件。

因此,如果您打算使用真实字段,则没有“稍后添加内容”。 您必须预先设计哪些字段应该存在。 因此,在最坏的情况下,您将定义所有可能的选项,并允许许多字段为空/空。 这是一个坏主意,因为它使得处理相应的对象确实容易出错。

另外,如果通过名称进行 “动态”寻址是您最重要的要求,则只需更改为使用一个字段(恰好是Map)即可,例如:

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

但是,当然,这消除了使用“编译时”字段提供的所有优势。 正如另一个答案所暗示的那样,使用此类映射的一种方法是使用标准Java 属性支持的方面。

做到这一点并具有一定灵活性的一种方法是使用称为PropertiesBag的东西。 这是一个Properties对象,您将能够添加新键并为其分配值。 您可以将其作为问题中的Person类的成员。 然后,您将需要为属性实现getter和setter,类似于Properties类。 因此,如果您的属性为非常简单的类型(String或可以从String实例化的任何东西)可以,那么应该没问题。

在这里您可以找到使用属性的一些示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM