Java中测试对象创建者的静态变量

Java中测试对象创建者的静态变量,java,testing,static,singleton,Java,Testing,Static,Singleton,我有如下的东西 TestObjectCreator{ private static Person person; private static Company company; static { person = new Person() person.setName("Joe"); company = new Company(); company.setName("Apple"); } public Person createTestPe

我有如下的东西

TestObjectCreator{

    private static Person person;

    private static Company company;

static {
    person = new Person()
    person.setName("Joe");
    company = new Company();
    company.setName("Apple");
}

public Person createTestPerson(){
    return person;
}

 public Person createTestCompany(){
    return company;
}
}

通过应用静态{}我得到了什么?因此,我假设对象是单态的。但是,如果我做了以下事情:

  Person person = TestObjectCreator.createTestPerson();
  person.setName("Jill");
  Person person2 = TestObjectCreator.createTestPerson();

person2会被命名为Jill还是Joe?

我看不到您的setter方法,但如果您正确地实现了它,它将是Jill

目前,您的类并不完全是一个单实例,因为仍然可以创建多个类实例。为了使您的类成为单例,请将构造函数设置为私有。然后,编写TestObjectCreator的静态实例,并通过静态工厂方法返回它


将Person和Company设置为静态的好处是,TestObjectCreator的所有实例都具有相同的Person和Company副本。我不确定这是否是您想要的,但它是static提供给您的

字段上的static关键字使它们表现为类实例。整个类有一个对象副本,该类的所有实例将共享同一个副本。当类加载到JVM中时,将调用您创建的静态构造函数。这将设置类的静态字段。在此之后,对静态字段的任何更改都会反映到对象的所有实例中


在您的示例中,这意味着当TestObjectCreator类加载到JVM中时,将创建person并将其名称设置为“Joe”。然后,使用第一个TestObjectCreator.createTestPerson()调用检索此人,并将此人的姓名更改为“Jill”。由于TestObjectCreator只有一个人,因此您现在已经在所有情况下更改了此人的姓名。所以,第二个人的名字应该是“吉尔”。

谢谢,这就是我要找的!我会尽可能给你答案,没问题!static关键字是Java中比较容易混淆的地方之一。我真的很高兴能帮你清理它。我相信“Person Person=TestObjectCreator.createTestPerson();”会导致编译器错误,因为该方法不是声明为静态的,并且你没有TestObjectCreator的实例。不正确。静态块在静态方法NO(编译器错误)之前执行。createTestPerson()是一个实例方法。