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

时间:2010-05-17 19:06:12

标签: 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 createTestPerson(){
    return person;
}

 public Person createTestCompany(){
    return company;
}

}

通过应用静态{}我获得了什么?我认为这些物体是单身人士。但是,如果我做了以下事情:

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

person2会被命名为Jill还是Joe?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我看不到你的setter方法,但是如果你已经正确实现了它,那就是Jill。

目前,您的课程并非完全是单身,因为仍然可以制作您课程的多个实例。为了使你的类单例化,使你的构造函数私有。然后,编写一个TestObjectCreator的静态实例,并通过静态工厂方法返回它。

使Person和Company保持静态的优势在于,TestObjectCreator的所有实例都具有相同的Person和Company副本。我不确定这是否是你想要的,但它是静态提供给你的。