2016-05-05 7 views
0

Ich habe ein Bean namens "EmployeeModel" und ich habe auch eine andere Klasse "EmployeeManager", die eine Methode zum Entfernen (Löschen) eines Mitarbeiters hat.Java Bean verwenden primitive oder Wrapper

Mein EmployeeModel:

package at.fh.swenga.employee.model; 

import java.util.Date; 

import javax.validation.constraints.Min; 
import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Past; 

import org.springframework.format.annotation.DateTimeFormat; 

public class EmployeeModel implements Comparable<EmployeeModel> { 

    @Min(1) 
    private int ssn; 

    private String firstName; 
    private String lastName; 

    private int salary; 


    @NotNull(message = "{0} is required") 
    @DateTimeFormat(pattern = "dd.MM.yyyy") 
    @Past(message = "{0} must be in the past") 
    private Date dayOfBirth; 

    public EmployeeModel() { 
    } 


    public EmployeeModel(int ssn, String firstName, String lastName, Integer salary, 
      Date dayOfBirth) { 
     super(); 
     this.ssn = ssn; 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.salary = salary; 
     this.dayOfBirth = dayOfBirth; 
    } 

    public int getSsn() { 
     return ssn; 
    } 

    public void setSsn(int ssn) { 
     this.ssn = ssn; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public int getSalary() { 
     return salary; 
    } 

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

    public Date getDayOfBirth() { 
     return dayOfBirth; 
    } 

    public void setDayOfBirth(Date dayOfBirth) { 
     this.dayOfBirth = dayOfBirth; 
    } 

    @Override 
    public int compareTo(EmployeeModel o) { 
     return ssn - o.getSsn(); 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ssn; 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     EmployeeModel other = (EmployeeModel) obj; 
     if (ssn != other.ssn) 
      return false; 
     return true; 
    } 
} 

Meine Methode in der EmployeeManager Klasse:

public boolean remove(int ssn) { 
    return employees.remove(new EmployeeModel(ssn, null, null,null, null)); 
} 

Wie Sie die Methode sehen dauert nur SSN, die vom Typ "int" ist. Das Problem ist, wenn mein Konstruktor das Gehalt als int nimmt, muss ich es auch in der Methode bereitstellen, aber ich möchte dies vermeiden. Wie Sie sehen können, hat mein Konstruktor eine Wrapper-Ganzzahl im Gehaltsfeld, aber wann immer ich meine Anwendung starte und versuche, einen Mitarbeiter zu entfernen, bekomme ich NullPointerExceptions?

Meine Frage ist jetzt, warum ich sie bekomme und wenn ich nur eine Wrapper-Klasse bei der Instantiierung wie "private Integer Gehalt" verwenden sollte; anstatt den primitiven Weg zu benutzen?

Antwort

0

1) Sie sollten einen Validierungsfehler werden immer beim Aufruf:

new EmployeeModel(ssn, null, null,null, null) 

Der letzte Parameter der dayOfBirth ist, die Sie haben eine @NotNull Validierungsprüfung.

2) Wenn Sie einen Konstruktor wie diesen mit Nullparametern aufrufen, dann haben Sie wahrscheinlich ein Problem, entweder mit den erforderlichen Parametern zum Konstruieren des Objekts (Sollte ssn der einzige erforderliche Parameter sein), oder Sie don ' Ich habe genug gültige Daten, um das Objekt richtig zu instantiieren. Wenn dateOfBirth nicht null sein sollte, sollten Sie NULL nicht an den Konstruktor übergeben.

Vielleicht sollten Sie den Standardkonstruktor EmployeeModel() entfernen und ersetzen sie durch eine, die die minimalen Parameter erwartet, wie:

public EmployeeModel(int ssn, Date dayOfBirth) 

Sie nicht zu ‚fälschen‘ versuchen sollten nur die Daten, die ein Problem wie dieses Problem zu umgehen . Wenn Sie sich Ihren Code anschauen, scheint es, dass SSN die einzigen echten Daten sind, die vorhanden sein müssen, um ein EmployeeModel zu erstellen. Sie sollten also die @NotNull aus der dayOfBirth entfernen und einen Konstruktor mit einem Argument bereitstellen, der nur die ssn akzeptiert. Das sollte dein Problem lösen. Sie sollten überall dort, wo Sie Berechnungen vornehmen, wie auf dem Gehalt, versichern, dass Sie defensive Nullkontrollen durchführen, bevor Sie die Berechnung versuchen.

public EmployeeModel(int ssn){ 
    this.ssn = ssn; 
} 
+0

Meine Frage war nicht über meine DayOfBirth, das funktioniert einfach gut. Bitte versuchen Sie, meine Frage noch einmal zu lesen. Und ja, die ssn ist das einzige Attribut, das benötigt wird, um einen Mitarbeiter zu entfernen, und ich wollte auch nicht das Attribut Gehalt weitergeben, um die Methode – Bajro

+0

zu verwenden. Ich habe dayOfBirth kommentiert, aber auf Ihre Frage fokussiert. Bitte versuchen Sie die Antwort erneut zu lesen und zu verstehen. – pczeus

+0

Darüber hinaus haben Sie keinen relevanten Code hinzugefügt, der zeigt, wie "Mitarbeiter" konstruiert und verwendet werden. Jede weitere Information wäre also nur eine "Vermutung". Bitte lesen Sie: http://stackoverflow.com/help/mcve Informationen zum Erstellen einer minimalen, vollständigen und gültigen Frage. – pczeus