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

テスト クラスの別の場所で追加した従業員の数に基づくと、5 人のはずです。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. すぐに、またはコンストラクターで値を初期化する必要があります

これは限界だと思うかもしれません。ただし、多くの場合、この情報は 1 回しか設定しないことがわかります (あなたの割り当てでは、名前と給与は一定のままになると思います)。いずれかを変更する必要がある場合は、final資格を簡単に削除できます。

private final String employeeName;
private final double currentPay;

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

メンバーが変更されないようにすることは、クラス インスタンスがimmutableであることを意味します。これは一般的に良いことです。不変クラスについて推論してデバッグするのは簡単で、暗黙的にスレッドセーフです。

于 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 に答える