繁体   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