Как я могу заставить этот класс работать на основе определенной переменной (ID)? - PullRequest
0 голосов
/ 10 марта 2019

Я пробую свои силы в разработке java и сталкиваюсь с проблемой.

Я создал 2 класса, Сотрудник и Контракт.Я пытаюсь сделать так, чтобы код в основном методе выполнялся для конкретных сотрудников.У каждого сотрудника есть свой идентификатор и имя.Код, который я сделал, ниже.

Employee.java

package com.company;

import java.util.ArrayList;

public class Employee {

// Employee Data
public int employeeId;
public String employeeName;

// Array of all contracts assigned to an employee
private static ArrayList<Contract> assignedContracts = new ArrayList<>();

// Size of assigned contracts array
private int contractAllocation;

public Employee(int employeeId, String employeeName, String ContractName1, String ContractName2, String ContractName3, String ContractName4, int ContractId1, int ContractId2, int ContractId3, int ContractId4, int ContractCost1, int ContractCost2, int ContractCost3, int ContractCost4, int MaxAssignedEmployees1, int MaxAssignedEmployees2, int MaxAssignedEmployees3, int MaxAssignedEmployees4)  {
    this.employeeId = employeeId;
    this.employeeName = employeeName;
    Main.createContracts(ContractName1, ContractName2, ContractName3, ContractName4, ContractId1, ContractId2, ContractId3, ContractId4, ContractCost1, ContractCost2, ContractCost3, ContractCost4, MaxAssignedEmployees1, MaxAssignedEmployees2, MaxAssignedEmployees3, MaxAssignedEmployees4);
    contractAllocation = assignedContracts.size();
}

// Print all assigned contracts to console (as table)
public void provideAssignedContracts() {
    System.out.println("-----------------------------------------------------------------------------");
    System.out.printf("%10s %20s %20s %20s", "CONTRACT ID", "CONTRACT NAME", "CONTRACT COST", "MAX EMPLOYEES");
    System.out.println();
    System.out.println("-----------------------------------------------------------------------------");
    for(int i = 0; i < assignedContracts.size(); i++) {
        System.out.format("%10s %20s %20s %22s",
                assignedContracts.get(i).getContractId(), assignedContracts.get(i).getContractName(), "£" + assignedContracts.get(i).getContractCost(), assignedContracts.get(i).getmaxAssignedEmployees());
        System.out.println();
    }
    System.out.println("-----------------------------------------------------------------------------");
}

// Number of assigned contracts
public int provideNumOfAssignedContracts() {
    // Count for number of contracts
    int count = 0 ;
    // Increment count for every contract
    for(int i = 0; i < assignedContracts.size(); i++) {
        count++;
    }
    // Return int for number of assigned contracts
    return count;
}

// Total cost of all assigned contracts
public int provideTotalCostOfAssignedContracts() {
    // variable to store cost in
    int sum = 0;
    // add each cost iteration to sum
    for(int i = 0; i < assignedContracts.size(); i++) {
        sum += assignedContracts.get(i).getContractCost();
    }
    // Return int for total cost
    return sum;
}

// Add a contract to the employee
public static void addContract(Contract contract) {
    assignedContracts.add(contract);
}
}

Contract.java

package com.company;

public class Contract {

// Contract Data
private int contractId;
private String contractName;
private int contractCost;
private int maxAssignedEmployees;

public Contract(String contractName, int contractId, int contractCost, int maxAssignedEmployees) {
    this.contractId = contractId;
    this.contractName = contractName;
    this.contractCost = contractCost;
    this.maxAssignedEmployees = maxAssignedEmployees;
}

// Return contract id
public int getContractId() {
    return contractId;
}

// Return contract name
public String getContractName() {
    return contractName;
}

// Return contract cost
public int getContractCost() {
    return contractCost;
}

// Return number of max employees for a contract
public int getmaxAssignedEmployees() {
    return maxAssignedEmployees;
}
}

Main.java

package com.company;

public class Main {

// Create employee 1
private static Employee Employee1 = new Employee(1, "Bradley", "Contract 1", "Contract 2", "Contract 3", "Contract 4", 1, 2,3,4,300,1200,500,900, 5,10,5,2);

// Create employee 2
private static Employee Employee2 = new Employee(2, "Patrick", "Contract 1", "Contract 2", "Contract 3", "Contract 4", 1, 2,3,4,300,1200,500,900, 5,10,5,2);

// Create contracts
public static void createContracts(String ContractName1, String ContractName2, String ContractName3, String ContractName4, int ContractId1, int ContractId2, int ContractId3, int ContractId4, int ContractCost1, int ContractCost2, int ContractCost3, int ContractCost4, int maxAssignedEmployees1, int maxAssignedEmployees2, int maxAssignedEmployees3, int maxAssignedEmployees4) {
    Employee.addContract(new Contract(ContractName1, ContractId1, ContractCost1, maxAssignedEmployees1));
    Employee.addContract(new Contract(ContractName2, ContractId2, ContractCost2, maxAssignedEmployees2));
    Employee.addContract(new Contract(ContractName3, ContractId3, ContractCost3, maxAssignedEmployees3));
    Employee.addContract(new Contract(ContractName4, ContractId4, ContractCost4, maxAssignedEmployees4));
}

// Show assigned contracts for employee
public static void displayAssignedContracts() {
    Employee1.provideAssignedContracts();
}

public static void main(String[] args) {
    System.out.println("Employee ID: " + Employee1.employeeId);
    System.out.println("Employee Name: " + Employee1.employeeName);
    System.out.println("Assigned Contracts: " + Employee1.provideNumOfAssignedContracts());
    System.out.println("Total cost of all contracts assigned: £" + Employee1.provideTotalCostOfAssignedContracts() + "\n");
    displayAssignedContracts();
}
}

Приведенное выше выводит следующее:

enter image description here

Предполагаемый вывод для консоли - отображать только назначенные контрактыдля сотрудника 1 я чувствую, что в одном из моих занятий мне нужно будет указать идентификатор сотрудника в качестве параметра, но каждый раз, когда я пытаюсь продвинуться в этом, я просто вызываю все больше и больше ошибок, я пробовал несколько решений, так чтоЯ бы прибег к публикации вопроса.

Любая помощь будет чрезвычайно признательна.

Заранее спасибо,

B

Обновление:

Main.Java

package com.company;

public class Main {

// Create employee 1
public static Employee Employee1 = new Employee(1, "Bradley", "Contract 1", "Contract 2", "Contract 3", "Contract 4", 1, 2,3,4,300,1200,500,900, 5,10,5,2);

// Create employee 2
public Employee Employee2 = new Employee(2, "Patrick", "Contract 1", "Contract 2", "Contract 3", "Contract 4", 1, 2,3,4,300,1200,500,900, 5,10,5,2);

// Create contracts
public static void createContracts(String ContractName1, String ContractName2, String ContractName3, String ContractName4, int ContractId1, int ContractId2, int ContractId3, int ContractId4, int ContractCost1, int ContractCost2, int ContractCost3, int ContractCost4, int maxAssignedEmployees1, int maxAssignedEmployees2, int maxAssignedEmployees3, int maxAssignedEmployees4) {
    Employee1.addContract(new Contract(ContractName1, ContractId1, ContractCost1, maxAssignedEmployees1));
    Employee1.addContract(new Contract(ContractName2, ContractId2, ContractCost2, maxAssignedEmployees2));
    Employee1.addContract(new Contract(ContractName3, ContractId3, ContractCost3, maxAssignedEmployees3));
    Employee1.addContract(new Contract(ContractName4, ContractId4, ContractCost4, maxAssignedEmployees4));
}

// Show assigned contracts for employee
public static void displayAssignedContracts() {
    Employee1.provideAssignedContracts();
}

public static void main(String[] args) {
    System.out.println("Employee ID: " + Employee1.employeeId);
    System.out.println("Employee Name: " + Employee1.employeeName);
    System.out.println("Assigned Contracts: " + Employee1.provideNumOfAssignedContracts());
    System.out.println("Total cost of all contracts assigned: £" + Employee1.provideTotalCostOfAssignedContracts() + "\n");
    displayAssignedContracts();
}
}

Employee.java

package com.company;

import java.util.ArrayList;

import static com.company.Main.*;

public class Employee {

// Employee Data
public int employeeId;
public String employeeName;

// Array of all contracts assigned to an employee
private final ArrayList<Contract> assignedContracts = new ArrayList<>();

// Size of assigned contracts array
private int contractAllocation;

public Employee(int employeeId, String employeeName, String ContractName1, String ContractName2, String ContractName3, String ContractName4, int ContractId1, int ContractId2, int ContractId3, int ContractId4, int ContractCost1, int ContractCost2, int ContractCost3, int ContractCost4, int MaxAssignedEmployees1, int MaxAssignedEmployees2, int MaxAssignedEmployees3, int MaxAssignedEmployees4)  {
    this.employeeId = employeeId;
    this.employeeName = employeeName;
    Main.createContracts(ContractName1, ContractName2, ContractName3, ContractName4, ContractId1, ContractId2, ContractId3, ContractId4, ContractCost1, ContractCost2, ContractCost3, ContractCost4, MaxAssignedEmployees1, MaxAssignedEmployees2, MaxAssignedEmployees3, MaxAssignedEmployees4);
    contractAllocation = assignedContracts.size();
}

// Print all assigned contracts to console (as table)
public void provideAssignedContracts() {
    System.out.println("-----------------------------------------------------------------------------");
    System.out.printf("%10s %20s %20s %20s", "CONTRACT ID", "CONTRACT NAME", "CONTRACT COST", "MAX EMPLOYEES");
    System.out.println();
    System.out.println("-----------------------------------------------------------------------------");
    for(int i = 0; i < assignedContracts.size(); i++) {
        System.out.format("%10s %20s %20s %22s",
                assignedContracts.get(i).getContractId(), assignedContracts.get(i).getContractName(), "£" + assignedContracts.get(i).getContractCost(), assignedContracts.get(i).getmaxAssignedEmployees());
        System.out.println();
    }
    System.out.println("-----------------------------------------------------------------------------");
}

// Number of assigned contracts
public int provideNumOfAssignedContracts() {
    // Count for number of contracts
    int count = 0 ;
    // Increment count for every contract
    for(int i = 0; i < assignedContracts.size(); i++) {
        count++;
    }
    // Return int for number of assigned contracts
    return count;
}

// Total cost of all assigned contracts
public int provideTotalCostOfAssignedContracts() {
    // variable to store cost in
    int sum = 0;
    // add each cost iteration to sum
    for(int i = 0; i < assignedContracts.size(); i++) {
        sum += assignedContracts.get(i).getContractCost();
    }
    // Return int for total cost
    return sum;
}

// Add a contract to the employee
public void addContract(final Contract contract) {
    assignedContracts.add(contract);
}
}

Без изменений Contract.java

Выход:

enter image description here

1 Ответ

1 голос
/ 10 марта 2019

Проблема в том, что вы поддерживаете список Contract как статическое поле

private static ArrayList<Contract> assignedContracts = new ArrayList<>();

Это означает, что эти Contract будут распределены среди всех Employee s.


Создание этого списка в поле экземпляра должно быть достаточным для решения этой проблемы (обратите внимание, я удалил static)

private final ArrayList<Contract> assignedContracts = new ArrayList<>();

Вам, очевидно, нужно обновить его использование, например

public void addContract(final Contract contract) {
   // Now this list is per-employee, not global!
   assignedContracts.add(contract);
}

и метод createContracts. Вам нужно будет ссылаться на конкретный экземпляр Employee, например employee1 или employee2.


В текущем коде есть пара проблем.

public static Employee Employee1 = new Employee(...)

То, что делает этот код, вызывает конструктор Employee, но, как вы можете видеть, вызов конструктора createContracts

public Employee(...)  {
    this.employeeId = employeeId;
    this.employeeName = employeeName;
    Main.createContracts(...); 
    contractAllocation = assignedContracts.size();
}

Который использует статическое поле Employee1.

public static void createContracts(...) {
    Employee1.addContract(...) <-- Here!

Это означает, что createContracts пытается получить доступ к экземпляру, который находится в стадии разработки , таким образом, это будет null, и NullPointerException будет брошено.

По сути, вам нужно полностью избавиться от static для полей Employee и переместить метод createContracts в Employee сам класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...