1. ホーム
  2. java

[解決済み] 配列は変数に解決できない - Java

2022-02-16 16:51:41

質問

従業員クラスがあります。

public abstract class Employee {

private String firstName;
private String lastName;
private int joinYear, joinMonth, joinDay;
LocalDate startDate;
static int idCounter=0;
private double employeeId;
private double numEmployees;
Employee[] employeeArray = new Employee[10];
private double monthlyEarnings;
// constructor
public Employee(String first, String last, int year, int month, int day) {
    firstName = first;
    lastName = last;
    joinYear=year;
    joinMonth=month;
    joinDay=day;
    startDate= new LocalDate(joinYear, joinMonth, joinDay);
    this.monthlyEarnings=0;
    this.setEmployeeId(idCounter);
    employeeArray[idCounter]=this;
    idCounter++;
    numEmployees++;
}
}

上で見たように、コンストラクタで、従業員オブジェクトが作成されると、employeeArrayに追加されます。 employeeArray[idCounter]=this;

そして、メインメソッドで配列のメンバーにアクセスしようとすると、エラー "employeeArray Cannot Be Resolved To a Variable" が発生します。

public class Test {

// test Employee hierarchy
public static void main(String args[]) {
Employee Employee1 = new Employee("John", "Smith", 1997, 8, 20);
Employee Employee2 = new Employee("Bob", "Oak", 1999, 6, 20);


System.out.println(employeeArray[1]); //error here
}
}

解決方法は?

明確に employeeArray はメインスコープから外れています。それを参照するには (instance of Employee).employeeArray .

しかし、Employee クラスのロジックが壊れているため、このケースは全く関係ありません。問題は、あなたの idCounteremployeeArray のすべてのインスタンスで共有されるわけではありません。 Employee . その代わりに Employee の各インスタンスは独自のリストとカウンターを持ちます (これは一見、必要ないように見えます)。

実のところ、このような場合には 静的 の配列は Employee をクラス自体の中で使用します。を使うのがより適切であると思われます。 List<Employee> の代わりに Employee[] というのも、(おそらく)事前に何人の従業員を保存する必要があるか分からないからです。

以下は、クラスを設計する際のポイントです。

public class Employee {
    private static List<Employee> employees = new ArrayList<>();

    // Your instance fields here
    int employeeId;


    public Employee() {
        // Constructor stuff
        this.employeeId = employees.size();

        employees.add(this); // Add the new employee to the list
    }

    public static List<Employee> getEmployees() {
        return employees;
    }
}