【问题标题】:Static variables in Java for a test oObject creatorJava中用于测试oObject创建者的静态变量
【发布时间】:2010-05-17 19:06:12
【问题描述】:

我有类似下面的东西

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

}

通过应用 static{} 我得到了什么?我假设这些对象是单例的。但是,如果我执行以下操作:

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

person2 会被命名为 Jill 还是 Joe?

【问题讨论】:

  • 我相信“Person person = TestObjectCreator.createTestPerson();”将导致编译器错误,因为该方法未声明为静态并且您没有 TestObjectCreator 的实例。
  • 不正确。静态块在静态方法之前执行
  • 不,编译器错误。 createTestPerson() 是一个实例方法。

标签: java testing static singleton


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这就是我想要的!我会尽快给你答案。
  • 没问题! static 关键字是 Java 中比较容易混淆的地方之一。我真的很高兴能帮你解决问题。
【解决方案2】:

我看不到您的 setter 方法,但应该是 Jill,以防您已正确实现它。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2012-09-12
    • 2016-02-07
    相关资源
    最近更新 更多