实现 `comparable` 和 `comparator` 接口:如何检查 int 变量是否格式正确?

implementing `comparable` and `comparator` interface: how to check whether int variables are well formed or not?

我正在学习将 comparablecomparator 接口实现到我自己的 class 的概念,并且我从 Java 教程 oracle 中看到了以下关于实施 comparablecomparator 接口的最佳实践:

The constructor checks its arguments for null. This ensures that all Name objects are well formed so that none of the other methods will ever throw a NullPointerException.

我正在尝试使用 int id, int salary, int age, String nameDate dateOfJoining 创建一个 Employee class 作为实例变量。我知道 int 等基本类型不能等于 null,但是我应该如何检查 int 变量是否格式正确?

public class Employee implements Comparable<Employee>{
    public static void main(String[] args) {

    }

    private int id;
    private String name;
    private int salary;
    private int age;
    private Date dateOfJoining;


    //how to check whether int varaibles are well formed or not? 
    public Employee(int id, String name, int salary, int age, Date dateOfJoining){
        this.id = id;
        this.name = name;
        this.salary = salary;
        this.age = age;
        this.dateOfJoining = dateOfJoining;
    }

    @Override
    public int compareTo(Employee o) {
        // to be implemented
    }
}

我找到了相关的 tutorial

The constructor checks its arguments for null. This ensures that all Name objects are well formed so that none of the other methods will ever throw a NullPointerException.

那个Name对象有两个字符串成员,必须检查它们是否为空。因为如果其中一个为空 lastName.compareTo(n.lastName); 这部分将导致 NullPointerException。您不需要为 int 成员创建这样的控件。因为正如你所说,int 变量不能是 null.

您参考的教程是 Object Ordering tutorial. The particular statement referred to the Name class that is given there as an example:如果您创建了这样一个 Name 对象,其中 firstNamelastName 对象是 null,那么 compareTo 方法将抛出 NullPointerException。这可以通过立即检查构造函数参数来防止。

更一般地说,您应该确保 compareTo 方法 不会 抛出任何异常。

正如您已经注意到的,在这个意义上,int 变量不可能是 "malformed"。不能是null,一个int的值与另一个

的值比较也不会导致异常。

但是,教程中还列出了其他几点,您应该注意:

  • 你应该实施 hashCode
  • 你应该实施 equals
  • 您应该确保 compareTo 的实现 与 equals 一致,如 Comparable documentation
  • 中所述
  • 如果可能,请将所有字段设置为 final,以便 class 不可变

提示:可以使用Integer#compare方法方便地比较int值。


旁注:请记住,虽然 int 值在 技术 意义上总是 "well formed",但肯定有 business 应在构造函数中检查的约束。在您的示例中,您可能希望为构造函数中的某些字段插入额外的健全性检查:

public Employee(int id, String name, int salary, int age, Date dateOfJoining){
    this.id = id;
    this.name = Objects.requireNonNull(name);
    if (salary <= 0) {
        throw new IllegalArgumentException(
            "The salary should be positive, but is "+salary);
    }
    this.salary = salary;
    if (age <= 0) {
        throw new IllegalArgumentException(
            "The age should be positive, but is "+salary);
    }
    this.age = age;
    this.dateOfJoining = Objects.requireNonNull(dateOfJoining);
}