簡體   English   中英

Java Bean使用原語或包裝

[英]Java Bean use primitive or Wrapper

我有一個名為“ EmployeeModel”的Bean,還有另一個類“ EmployeeManager”,它具有一種刪除(刪除)雇員的方法。

我的員工模型:

    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;
    }
}

我在EmployeeManager類中的方法:

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

如您所見,該方法僅采用類型為“ int”的ssn。 問題是當我的構造函數將薪水作為整數時,我也必須在方法中提供薪水,但我想避免這種情況。 如您所見,我的構造函數在salary字段具有包裝器Integer,但是每當我啟動我的應用程序並嘗試刪除Employee時,我都得到NullPointerExceptions嗎?

現在我的問題是為什么我要得到它們,如果我也只在實例化時使用包裝類,例如“私有整數薪水”; 而不是使用原始方式?

1)調用時,您應該收到驗證錯誤:

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

最后一個參數是dayOfBirth,您需要進行@NotNull驗證檢查。

2)如果您發現自己使用空參數調用這樣的構造函數,那么您可能會遇到問題,要么是構造對象所需的必需參數(應該ssn是唯一的必需參數),要么是沒有足夠的有效值數據以正確實例化該對象。 如果dateOfBirth不為null, dateOfBirth應將null傳遞給構造函數。

也許您應該刪除默認的構造函數EmployeeModel() ,並將其替換為需要最小參數的構造函數,例如:

public EmployeeModel(int ssn, Date dayOfBirth)

您不應該僅僅為了克服此類問題而嘗試“偽造”數據。 通過查看您的代碼,似乎SSN是創建EmployeeModel時必須存在的唯一真實數據,因此也許您應該從dayOfBirth刪除@NotNull並提供僅接受ssn的單參數構造函數。 那應該解決您的問題。 您將要確保在進行計算的任何地方(如薪水),在嘗試計算之前都要進行防御性的空檢查。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM