【问题标题】:Static values are based on the number of classes in Java?静态值是基于Java中类的数量吗?
【发布时间】:2020-07-18 08:24:29
【问题描述】:

我对java非常生疏,并试图在youtube教程中重新学习它,代码如下:这是Person.java

package com.gurmeet.javacourse.lesson2;

import com.gurmeet.javacourse.lesson3.Name;

public class Person {

private Name personName;
private static int personCounter;

public Person()
{
    personCounter++;
    /*
     * empty on purpose - default constructor
     */
}

public Person(Name personName) {
    this.personName = personName;
}

public String helloWorld() {
    // TODO Auto-generated method stub
    return "Hello World";
}

public String hello(String name) {
    // TODO Auto-generated method stub
    return "Hello " + name;
}

public static int numberOfPersons() {
    // TODO Auto-generated method stub
    return personCounter;
}

}

这是 PersonTest.java

package com.gurmeet.javacourse.lesson2;
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class PersonTest {

@Test
public void shouldReturnHelloWorld() {
    
    
    Person marcus = new Person();   
    assertEquals("Hello World", marcus.helloWorld());
}

@Test
public void shouldReturnHelloMarcus() {
    Person person = new Person();
    assertEquals("Hello Marcus", person.hello("Marcus"));

}

@Test
public void shouldReturnNumberOfPersons() {
    Person person1 = new Person();
    Person person2 = new Person();
    Person person3 = new Person();
    Person person4 = new Person();

    assertEquals(4, Person.numberOfPersons() - 1);

}

}

以上这两个在同一个包中,但我在同一个项目中创建了另一个包,如下所示:

package com.gurmeet.javacourse.lesson3;

public class Name {

}

我正在使用 JUnit 测试我的代码,但在我的代码的最后一次测试中,我一直收到错误消息,您看到人数应该是 4,但结果一直显示 5。youtube 的家伙得到了正确的答案,即使我正确地遵循了他的编码,我也没有。我在本教程中了解到静态是全局的,在类级别,因为我在同一个包中创建了两个类,所以 personCounter 默认不是 1 而是 2,因此它一直显示 5 而不是4.我通过在方法中减去1来解决它,但我认为这不是正确的方法。我的推理正确吗?还是有其他解释。最重要的是,我该如何解决这个问题?如果我犯了任何错误,请放过我。

【问题讨论】:

  • 作为旁注,当您调用非默认构造函数时,您不会增加计数器

标签: java eclipse maven static junit5


【解决方案1】:

我猜主要问题是当您运行前两个测试时,静态变量 personCounter 变为 2,因为您正在创建两个对象。然后当你运行第三个测试时,它从 3 开始,一直到 6。

我猜如果您添加另一个方法将人员计数器设置为零并在第三次测试中创建对象之前调用此方法,您将得到 4 作为输出。

将此作为函数添加到您的类中

public static void setNumberOfPersons(int value) { personCounter = value; }

然后在第三次测试中先调用Person.setNumberOfPersons(0);

编辑:

感谢seelenvirtuose(见评论)指出随机顺序部分进行测试。如前所述,我想通过在第三次测试中将值设置为 0 来解决问题。这样顺序就无关紧要了。

【讨论】:

  • 虽然这走向了正确的方向,但这并不完全正确。默认情况下,JUnit 使用确定性但不可预测的顺序 (MethodSorters.DEFAULT) 运行测试。此默认策略使用其哈希码比较测试方法。碰巧shouldReturnNumberOfPersons 排在第二位 - 人数等于 5。
  • 这里我以为是因为静电,我真的不擅长这个哈哈。如何将值重置为 0?
  • @CodingNeeded 这是一个很好的例子,说明为什么静态是一个大问题。而不是有所有这些问题的personCounter,你应该有一个List<Person>;您可以根据需要制作任意数量,只需致电size()
猜你喜欢
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2010-10-14
  • 1970-01-01
  • 2013-04-21
相关资源
最近更新 更多