0

我用这个把头撞在墙上已经有一段时间了——

我有一个方法来创建另一个类的对象列表:

    public List <PayrollRecord> processPayroll() {
    List<PayrollRecord> payroll = new ArrayList<PayrollRecord>();
    for (Employee employee : staff) {
        PayrollRecord payRec = new PayrollRecord(employee.getName(), employee.calculatePay());
        payroll.add(payRec);
    }
    return payroll;
}

staff 是一个 Employee 类对象的列表,可以通过这个方法添加到列表中:

    public void addEmployee(Employee employee) {
    staff.add(employee);
}

Employee 也是由其他几个类实现的接口——Manager、SalesAssociate 和 StoreEmployee。(你能告诉我我正在尝试完成一项任务吗?也许你们中有些人很熟悉)。

PayrollRecord 类如下所示:

    package my.package.ext;

public class PayrollRecord {

    private String employeeName;
    private double currentPay;

    public PayrollRecord(String employeeName, double currentPay) {

    }

    public double getCurrentPay() {


        return this.currentPay;
        }

        public String getEmployeeName() {
            return this.employeeName;
        }

    }

所以在一个测试类中,我应该能够为员工信息创建一些变量,将一些员工添加到员工,然后运行 ​​processPayroll 方法并对其进行一些断言。我的测试类目前看起来像这样(并且需要更多的断言。在我弄清楚这个基本问题之前,我不会费心添加这些断言):

    @Test
public void testPayroll() {
    List<PayrollRecord> list = store.processPayroll();
    assertEquals(managerTestPay, list.get(0).getCurrentPay(), 0);
}

根据我在测试班其他地方添加的员工数量,应该有五个。我可以设置 list.get 越界并验证确实有 5 个。但是问题是所有 5 条记录都是 null 和 0.0。我应该为每个员工记录命名并支付费用。然而,断言错误又回来了,向我展示了我的预期,但实际值为 0.0(或者当我尝试 list.get(0).getName() 时为 null)。

预先感谢您的帮助和智慧。

4

2 回答 2

2

而你设置的成员如何?

private String employeeName;
private double currentPay;

public PayrollRecord(String employeeName, double currentPay) {

}

在您的构造函数中,您需要分配给成员,例如

this.employeeName = employeeName;

仅使用参数调用构造函数是不够的。需要使用参数来填充类的成员(直接或通过某些操作)。

这里一个有用的技术是将成员变量设置为final. 这表示:

  1. 您不能在初始化后更改它们的值
  2. 您必须立即或在构造函数中初始化值

你可能认为这是一个限制。然而很多时候你会发现你只设置了一次这个信息(我怀疑你的任务名称和薪水将保持不变)。如果您需要更改其中一项,则可以轻松删除final资格。

private final String employeeName;
private final double currentPay;

public PayrollRecord(String employeeName, double currentPay) {
   this.employeeName = employeeName;
   // etc...
}

确保成员不变意味着类实例是不可变的。这通常是一件好事。很容易推理和调试不可变类,并且它们是隐式线程安全的。

于 2012-11-30T17:14:09.697 回答
0

您没有将构造函数参数分配给类变量。将您的构造函数更新为:

     public PayrollRecord(String employeeName, double currentPay) {
        this.employeeName = employeeName;
        this.currentPay = currentPay;
     }
于 2012-11-30T17:16:53.997 回答