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

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

假设这是我现在的对象,我从文本文件输入的信息如下: 姓名=约翰 年龄=21 姓氏=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];
            }
        }
    }
}

对不起,如果这真的很不稳定,我还没来得及开始,所以我现在就把它编码了。在制作新字段时,它应该在我调用的对象 class 中吗?例如:

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

然后我可以打电话给那个?

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

Here 您可以找到一些使用属性的示例

你不能两者兼顾:Java 是一种静态编译语言。 类 的 字段 是 "static" 的东西。您不能在 运行时 以编程方式添加 new 字段。您可以使用反射来动态确定存在哪些字段,并填充字段内容。这就是所有 XML/JSON 映射器为您所做的:读取 XML/JSON 内容并将值推送到 Java 对象实例,或者反过来:从那里获取数据,并将其转换为 XML/JSON 个文件。

因此,如果您打算使用真实字段,则没有 "adding things later"。您必须预先设计应该有哪些字段。因此,最坏的情况是,您定义了所有可能的选项,并允许许多字段为 null/empty。这是一个坏主意,因为它使得处理相应的对象真的很容易出错。

或者,如果通过 name "dynamic" 寻址是您最重要的要求,那么只需更改为使用一个字段,恰好是一个 Map,例如:

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

但是,当然,这会带走使用 "compile time" 中的字段所提供的所有优势。正如另一个答案所暗示的那样,一种 使用此类地图的方法是使用标准 Java properties 支持的各个方面。