我有一个名为“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。 问题是当我的构造函数将工资作为int时,我必须在方法中提供它,但我想避免这种情况。正如你所看到的,我的构造函数在salary字段中有一个包装器Integer但是每当我启动我的Application并试图删除一个Employee时我都会得到NullPointerExceptions?
我的问题现在是为什么我得到它们,如果我还应该在实例化中使用包装类,如“私有整数薪水”;而不是使用原始的方式?
答案 0 :(得分:0)
1)调用时应该收到验证错误:
new EmployeeModel(ssn, null, null,null, null)
最后一个参数是dayOfBirth,您可以进行@NotNull
验证检查。
2)如果你发现自己用null参数调用这样的构造函数,那么你可能会遇到一个问题,或者是构造对象所需的必需参数(应该是唯一必需的参数),或者你没有有足够的有效数据来正确实例化对象。如果dateOfBirth
不应为null,则不应将null传递给构造函数。
也许您应该删除默认构造函数EmployeeModel()
并将其替换为需要最小参数的构造函数,例如:
public EmployeeModel(int ssn, Date dayOfBirth)
你不应该试图“伪造”数据只是为了克服这样的问题。从查看代码看,SSN似乎是创建EmployeeModel必须存在的唯一真实数据,所以也许您应该从@NotNull
中删除dayOfBirth
并提供单参数构造函数只接受ssn。那应该可以解决你的问题。你需要在计算的任何地方投保,比如工资,你在进行计算之前进行防御性空检查。
public EmployeeModel(int ssn){
this.ssn = ssn;
}