此外,良好的作风是只有一个构造函数,做所有的实际工作,即使你有一个以上的构造函数。术语指定的构造函数来自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
变量。
一般来说,你对构造函数的理解如何? – 2013-03-19 02:27:13