как использовать non-static метод в non-static методе

использовать метод sumOfSalaryInTheDepartment в методе averageSalary. проблема в строке double sumOfSalaryInTheDepartment = EmployeeBook.sumOfSalaryInTheDepartment(department); не могу обратиться через EmloyeeBook, т.к метод non-static и не понимаю как создать обьект для использования метода

public class Main {
    public static void main(String[] args) {
        int max = 2;
        EmployeeBook arr = new EmployeeBook(max);
        arr.insert("Ivan", 3, 45999);
        arr.insert("Valya", 3, 56667);

        double sum = arr.sumOfSalaryInTheDepartment(3);
        System.out.println("Sum of salaries in department 3: " + sum);

//        double average = arr.averageSalary(3);
//        System.out.println("Average salary in department 3: " + average);
    }
}
class Employee {
    private String name;
    private int department;
    private double salary;
    final private int id;
    private static int nextId = 1;

    public Employee(String name, int department, double salary) {
        this.name = name;
        this.department = department;
        this.salary = salary;
        this.id = nextId;
        nextId++;
    }

    public String getName() {
        return name;
    }

    public int getDepartment() {
        return department;
    }

    public double getSalary() {
        return salary;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }


    public void setDepartment(int department) {
        this.department = department;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

}
class EmployeeBook {
    private final Employee[] employees;
    private int countOfElements;

    public EmployeeBook(int max) {
        employees = new Employee[max];
        countOfElements = 0;
    }


    public void insert(String name, int department, double salary) {
        employees[countOfElements] = new Employee(name, department, salary);
        countOfElements++;
    }

    public double sumOfSalaryInTheDepartment(int department){
        double sum = 0;

        for (Employee employee: employees){
            if(employee != null && employee.getDepartment() == department){
                sum += employee.getSalary();
            }
        }
        return sum;
    }
    public double averageSalary(int department){
        int countOfEmloyeesInTheDepartment = 0;

        double sumOfSalaryInTheDepartment = EmployeeBook.sumOfSalaryInTheDepartment(department);

        for (Employee employee: employees) {
            if(employee != null && employee.getDepartment() == department){
                countOfEmloyeesInTheDepartment += 1;
            }
        }
        return sumOfSalaryInTheDepartment / countOfEmloyeesInTheDepartment;
    }
}

Ответы (1 шт):

Автор решения: Nowhere Man

В нестатическом методе averageSalary НЕ нужно вызывать метод sumOfSalaryInTheDepartment как статический, используя имя класса. Также НЕ нужно создавать никакой дополнительный объект, так как средняя зарплата вычисляется для данного экземпляра класса EmployeeBook.

Достаточно использовать ключевое слово this для указания ссылки на текущий экземпляр класса, у которого будет вычисляться суммарная зарплата, но в данном случае его можно опустить.

Также следует учесть, что количество служащих может оказаться равным 0 (при указании неверного отдела), тогда средняя зарплата не будет существовать вообще (возникнет деление на 0). В таких случаях лучше возвращать null (в старом стиле) или же OptionalDouble/Optional<Double> с пустым значением.

public Double averageSalary(int department) {
    int employeeCount = 0;
    for (Employee employee : employees) {
        if (employee != null && employee.getDepartment() == department) {
            employeeCount++;
        }
    }
 
    return employeeCount > 0 ? this.sumOfSalaryInTheDepartment(department) / employeeCount : null;
}

Может есть другой вариант решения, без использования метода.

Конечно есть. При указанном повторном использовании метода sumOfSalaryInTheDepartment получается лишняя итерация по массиву служащих, поэтому имеет смысл вычислять среднюю зарплату независимо (без вызова этого метода), то есть будет один проход по массиву.
Также лучше использовать известный параметр countOfElements в стандартном цикле for, чтобы избежать лишних проверок на null.

public Double averageSalary(int department) {
    int employeeCount = 0;
    double deptSalary = 0;
    for (int i = 0; i < countOfElements; i++) {
        Employee employee = employees[i];
        if (employee.getDepartment() == department) {
            deptSalary += employee.getSalary();
            employeeCount++;
        }
    }
 
    return employeeCount > 0 ? deptSalary / employeeCount : null;
}

Для справки: Вариант реализации с использованием Stream API, в частности Stream::filter, Stream::mapToDouble, DoubleStream::average, возвращающим OptionalDouble:

public OptionalDouble averageSalary(int department) {
    return Arrays.stream(employees) // Stream<Employee>
        .limit(countOfElements)
        .filter(Objects::nonNull)
        .filter(employee -> employee.getDepartment() == department)
        .mapToDouble(Employee::getSalary) // DoubleStream
        .average();
}
→ Ссылка