Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何告诉程序向对象添加新字段?_Java_Object_Field - Fatal编程技术网

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

Java 如何告诉程序向对象添加新字段?,java,object,field,Java,Object,Field,所以我有一个我正在做的小项目,它基本上需要程序从一个文本文件中读取并将信息添加到对象中。但是,如果程序发现一个新字段在程序上不可用,我希望程序添加一个新字段 public class Person{ public person(String name, int age){ this.name=name; this.age=age; } } 假设现在这是我的对象,我从文本文件输入的信息如下: Name=John Age=21 lastName=

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

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

然后我就可以调用它了?

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


您可以找到一些使用属性的示例,但不能两全其美:Java是一种静态编译语言。类的字段是“静态”的。无法在运行时以编程方式添加新字段。您可以使用反射动态显示存在哪些字段,并填充字段内容。这就是所有XML/JSON映射器为您所做的:读取XML/JSON内容并将值推送到Java对象实例中,或者反过来:从那里获取数据,并将其转换为XML/JSON文件

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

或者,如果通过名称进行“动态”寻址是您最重要的要求,则只需更改为使用一个字段,这恰好是一个映射,如:

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

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

我建议您将每一行保留为特定于一个人的属性,并用分隔符分隔。因此,读取和处理它会容易得多。您可以使用
映射
根据需要添加任何字段/值。这很容易迭代这些值。问题出在数据类型上。我交替使用它和使用对象的arrayList。这听起来像是最可能的选择,如果你不介意我问你,我如何在这个实例中使用properties对象不要解释properties对象本身,相反,在Person类中创建getProperty和setProperty方法,并在需要时在main中调用它们。。如果我创建一个包含标题(字段)和信息(仅与信息相关)的对象的arrayList,并将其存储到Person对象中,会怎么样?我知道这会更复杂,但这不可能吗?我将在Person对象中有一个方法,该方法将字符串参数作为标题(例如name),并按标题搜索arraylist并返回所需的对象。另一个是向arrayList添加一个新对象。通过属性,您可以获得get/add/set/remove和许多其他现成的方法。在ArrayList中,您需要实现一些功能,以避免在添加新属性时重复应用程序。就我个人而言,在这种特殊情况下,很难看出ArrayList相对于属性的优势。太好了,我会利用它,看看我能做些什么。非常感谢
Map<String, Object> myData = new HashMap<>();