此外,一种好的风格是只有一个构造函数来完成所有实际工作,即使你有多个构造函数。术语指定构造函数来自Objective-C,但它仍然是一个好主意。假设你这样写:
public Person(String f, String l, int a, char g) {
// Use more expressive argument names.
firstName = f;
lastName = l;
age = a;
gender = g;
retired = false;
address = null;
}
然后,将您的无参数构造函数重写为
public Person() {
this(null, null, 0, '?');
// Invoke the designated constructor with those arguments.
retired = false;
address = null;
}
如果构造函数的第一条语句是this(...)
,则构造函数正在调用该类的其他构造函数之一。类似地,如果构造函数的第一条语句是super(...)
,则调用父类的构造函数。如果两者都不做,super()
则假设。
然后,由于retired
和address
在两个构造函数中的设置方式相同,因此在它们的声明中初始化它们:
private boolean retired = false;
private String address = null; // If it's a String; it could be its own object type.
然后,因为false
和null
是实例变量初始化的默认值,请将这两行替换为:
private boolean retired;
private String address;
稍后,您可以添加错误检查。例如,人们没有负年龄,所以插入语句
if (a < 0) {
throw new IllegalArgumentException("A Person cannot have a negative age: "
+ a);
}
在指定构造函数的开头会很有用。这样,您只需执行一次。
当您了解 Java 枚举时,您可以通过编写以下代码来使您的性别变量更加精确:
// Gender is a grammatical term, Sex is a biological term.
public enum Sex {
MALE, FEMALE;
}
并使用Sex
而不是char
你的gender
变量。