![](/img/trans.png)
[英]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.