[英]Java 1.5 Is it always possible to use the wrapper class instead of the primitive?
[英]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.