Java Bean使用原语或包装器

时间:2016-05-05 14:09:31

标签: java javabeans wrapper pojo primitive

我有一个名为“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?

我的问题现在是为什么我得到它们,如果我还应该在实例化中使用包装类,如“私有整数薪水”;而不是使用原始的方式?

1 个答案:

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