实现 `comparable` 和 `comparator` 接口:如何检查 int 变量是否格式正确?
implementing `comparable` and `comparator` interface: how to check whether int variables are well formed or not?
我正在学习将 comparable
和 comparator
接口实现到我自己的 class 的概念,并且我从 Java 教程 oracle 中看到了以下关于实施 comparable
和 comparator
接口的最佳实践:
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 name
和 Date 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
对象,其中 firstName
或 lastName
对象是 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);
}
我正在学习将 comparable
和 comparator
接口实现到我自己的 class 的概念,并且我从 Java 教程 oracle 中看到了以下关于实施 comparable
和 comparator
接口的最佳实践:
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 name
和 Date 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
对象,其中 firstName
或 lastName
对象是 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);
}