Far*_*sbi 1 java inheritance constructor
正如我们在子类的构造函数体中所知,父构造函数必须是第一个语句,否则我们会得到编译时错误.这里已经讨论过这个主题.
让我们假设调用父构造函数会导致系统资源成本过高.另一方面,在子类构造函数中我们需要首先检查一些条件,如果条件满足,我们很好地通过父构造函数,那么就没有必要更进一步(假设抛出异常):
class parent {
parent(Object blah) {
//Heavy resource consuming tasks
}
}
class child extends parent {
child(Object blah, boolean condition) {
if (!condition) throw new IllegalArgumentException("Condition not satisfied");
super(blah); //Compile error!
}
}
Run Code Online (Sandbox Code Playgroud)
如果有人有同样的问题,我很好奇无论如何要处理这种情况,或者我必须先调用父构造函数,无论浪费多少资源然后抛出异常?
Ser*_*nov 10
你可以这样做:
public class Jlaj extends ArrayList<String> {
public Jlaj(int capacity) {
super(checkCapacity(capacity));
}
private static int checkCapacity(int capacity) {
if (capacity > 1000)
throw new IllegalArgumentException();
return capacity;
}
public static void main(String[] args) {
new Jlaj(1001); // this throws IAE all right
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您只能以这种方式调用静态方法,这很好:在部分初始化的对象上调用实例方法已经是一个巨大的麻烦,甚至在超类构造函数成为噩梦之前调用它们.
现在如果你需要检查一些你没有传递给超类的其他参数呢?你可以这样做:
public class Jlaj extends ArrayList<String> {
private final Object foo;
public Jlaj(int capacity, Object foo) {
super(checkArgumentsAndReturnCapacity(capacity, foo));
this.foo = foo;
}
private static int checkArgumentsAndReturnCapacity(int capacity, Object foo) {
if (capacity > 1000)
throw new IllegalArgumentException();
if (foo == null)
throw new NullPointerException();
return capacity;
}
public static void main(String[] args) {
new Jlaj(1000, null); // throws NPE
}
}
Run Code Online (Sandbox Code Playgroud)
它有效,但看起来有点难看.你将两个不相关的东西传递给一个只返回超类参数的函数.至少描述性名称在某种程度上弥补了这一点.
| 归档时间: |
|
| 查看次数: |
1730 次 |
| 最近记录: |