Potpuni promašaj ako staviš samo jedan seter. Lepo je Dule objasnio, šta ako moraš samo jedan atribut klaseda promeniš, na primer firstName?
Kako god hoćeš, možeš i uraditi kako ti profesorka kaže, samo zapamti zbog sebe da to nije ispravno. Valjda i sam uviđaš da to nije u redu.
Uglavnom ja sam ti odradio ovu klasu i prepravio neke stvari koje smo pogrešno odradili pa pogledaj kod. Naravno stavio sam ti i komentare.
1) Name the class TestEmployeePayroll
Urađeno.
2) Instantiate one EmployeePayroll object that initially sets the first name, last name, and ID fields to your name and student number, the pay rate field to 20.00 and the hours worked field to 38.0.
Ovde se kaže da treba da kreiramo jedan objekat klase EmployeePayroll i da mu prosledimo first name, last name, id, pay rate, and hours worked. Na osnovu ovoga zaključujem da drugi konstruktor u klasi ne treba da inicijalizuje netPay i grossPay. To je i logično i to smo ti mi i pričali, jer nelogično je da ti prosleđuješ neto i bruto platu, upravo zato pravimo klasu da bi ona sama izračunala ove vrednosti. Znači evo u kodu ispod sam ti ispravio konstruktor da odgovara ovim zahtevima.
3) Instantiate a second EmployeePayroll object using the default constructor.
Ovo instanciramo podrazumevanim konstruktorom. To je linija:
EmployeePayroll employee2 = new EmployeePayroll();
4) Instantiate an object of the ReadKb class so that your test class can receive user input from the keyboard.
Ovo je klasa koja nije standardna tj. ne postoji u java-sdk već je možeš dobiti sa koristeći neku biblioteku. Ja sam našao na internetu implementaciju ove klase i ubacio sam je u projekat. Pogledaj kod ispod.
5) User input is required for first name, last name, ID, hours worked and pay category (see following table)
Category Pay Rate
1 $55.00
2 $30.00
3 $25.00
4 $20.00
Znači korisnik treba da unese kategoriju a mi kasnije u programu to pretvaramo u cenu rada (payRate). To činimo switch konstrukcijom.
6) Validation is required for user input of hours worked (must be between 0 and 60 inclusively) and pay category (must be between 1 and 4 inclusively). Assume the user will enter only numeric input for these values.
Validaciju rade do while petlje. Uzeto je do while a ne while petlja posto se do while petlja izvrsava makar jednom, a to je ono što nama treba.
7) The values entered by the user are to be assigned to the fields of the second EmployeePayroll object using the appropriate setter methods.
Ovde se jasno vidi iz samog smisla rečenice da moramo da imamo seter metode a ne samo jednu seter metodu.
8) Calculate gross and net pay for each EmployeePayroll object.
Na osnovu ovoga se vidi da u konstruktoru koji prihvata vrednosti ne smemo da prosleđujemo bruto i neto platu nego da se one izračunavaju pomoću metoda koje smo napravili (to su calculateNetPay i calcluateGrossPay).
Evo u nastavku izvornog koda:
Code:
/*
FileName: EmployeePayroll.java
*/
public class EmployeePayroll {
private String firstName;
private String lastName;
private String id;
private int hoursWorked;
private double payRate;
private double grossPay;
private double netPay;
//Ovo je poreska stopa, zato je konstanta (ključna reč final).
//Konvencija je da se imena konstanti pišu velikim slovima, i da se između reči stavlja donja crta
private final double TAX_RATE = 0.42;
public EmployeePayroll() {
firstName = "";
lastName = "";
id = "";
hoursWorked = 0;
payRate = 0;
grossPay = 0;
netPay = 0;
}
public EmployeePayroll(String firstName, String lastName, String id, double payRate, int hoursWorked) {
this.firstName = firstName;
this.lastName = lastName;
this.id = id;
this.hoursWorked = hoursWorked;
this.payRate = payRate;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setID(String id) {
this.id = id;
}
public void setHoursWorked(int hoursWorked) {
this.hoursWorked = hoursWorked;
}
public void setPayRate(double payRate) {
this.payRate = payRate;
}
public void setGrossPay(double grossPay) {
this.grossPay = grossPay;
}
public void setNetPay(double netPay) {
this.netPay = netPay;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getID() {
return id;
}
public int getHoursWorked() {
return hoursWorked;
}
public double getPayRate() {
return payRate;
}
public double getGrossPay() {
return grossPay;
}
public double getNetPay() {
return netPay;
}
public void calculateGrossPay() {
if (hoursWorked <= 38)
grossPay = hoursWorked * payRate;
else if (hoursWorked <= 42)
grossPay = 38 * payRate + (hoursWorked - 38) * 1.5 * payRate;
else if (hoursWorked <= 60)
grossPay = 38 * payRate + 4 * 1.5 * payRate + (hoursWorked - 42)
* 2 * payRate;
}
public void calculateNetPay(){
netPay = grossPay - (grossPay*TAX_RATE);
}
}
Code:
/*
FileName: TestEmployeePayroll.java
*/
public class TestEmployeePayroll {
/**
* @param args
*/
public static void main(String[] args) {
String firstName;
String lastName;
String id;
int hoursWorked;
double payRate;
double grossPay;
double netPay;
int payCategory;
EmployeePayroll employee1 = new EmployeePayroll("Stevan", "Stevic", "144", 20, 38);
EmployeePayroll employee2 = new EmployeePayroll();
ReadKb readKb=new ReadKb();
System.out.print("Enter your first name: ");
firstName=readKb.getString();
System.out.print("Enter your last name: ");
lastName=readKb.getString();
System.out.print("Enter your employee ID: ");
id=readKb.getString();
//Validacija sata rada. Vraćamo korisnika na ovaj korak sve dok ne unese ispravnu vrednost.
do {
System.out.print("Enter hours worked (0-60):");
hoursWorked = readKb.getInt();
} while (hoursWorked < 0 || hoursWorked > 60);
//Isto kao iznad.
do {
System.out.print("Enter your pay category (1-4):");
payCategory=readKb.getInt();
} while (payCategory <1 || payCategory>4);
//Ovo je zadatak pod 7
employee2.setFirstName(firstName);
employee2.setLastName(lastName);
employee2.setID(id);
employee2.setHoursWorked(hoursWorked);
switch (payCategory) {
case 1:
employee2.setPayRate(55);
case 2:
employee2.setPayRate(30);
case 3:
employee2.setPayRate(25);
case 4:
employee2.setPayRate(20);
}
employee1.calculateGrossPay();
employee1.calculateNetPay();
employee2.calculateGrossPay();
employee2.calculateNetPay();
System.out.println("*********************************************");
System.out.println("employee1");
System.out.println("Employee name:" + employee1.getFirstName() + " " + employee1.getLastName());
System.out.println("Employee ID: " + employee1.getID());
System.out.println("Hours worked: " + employee1.getHoursWorked());
System.out.println("Pay rate: " + employee1.getPayRate());
System.out.println("Gross pay:" + employee1.getGrossPay());
System.out.println("Net pay:" + employee1.getNetPay());
System.out.println("*********************************************");
System.out.println("employee1");
System.out.println("Employee name:" + employee2.getFirstName() + " " + employee2.getLastName());
System.out.println("Employee ID: " + employee2.getID());
System.out.println("Hours worked: " + employee2.getHoursWorked());
System.out.println("Pay rate: " + employee2.getPayRate());
System.out.println("Gross pay:" + employee2.getGrossPay());
System.out.println("Net pay:" + employee2.getNetPay());
}
}
Code:
/*
FileName: ReadKb.java
*/
import java.util.Scanner;
public class ReadKb {
private Scanner scanner = new Scanner(System.in);
public double getDouble() {
double d = 0.0;
if (scanner.hasNextDouble()) {
d = scanner.nextDouble();
} else {
String s = scanner.next();
System.out
.println("You entered: " + s + "- a double was expected.");
}
return d;
}
public int getInt() {
int i = 0;
if (scanner.hasNextInt()) {
i = scanner.nextInt();
} else {
String s = scanner.next();
System.out
.println("You entered: " + s + "- a double was expected.");
}
return i;
}
public String getString() {
String s = scanner.next();
return s;
}
public String getLine() {
String s = scanner.nextLine();
return s;
}
}
Evo u prilogu imaš i jar izvršnu datoteku pa probaj kako to radi. Uđi u konzolu (ne znam da li koristiš vindovs ili linuks), i kucaj:
java -jar TestEmployeePayroll.jar
i testiraj aplikaciju.
Kod mene je to izgledalo ovako:
