这是我需要扩展的外部类:
public class Binary {
public Binary( byte type , byte[] data ){
_type = type;
_data = data;
}
public byte getType(){
return _type;
}
public byte[] getData(){
return _data;
}
public int length(){
return _data.length;
}
final byte _type;
final byte[] _data;
}
这是我创建的子类:
import org.bson.types.Binary;
public class NoahId extends Binary {
public NoahId(byte[] data) {
//Constructor call must be the first statement in a constructor
super((byte) 0 , data);
}
}
我想强制所有子类(NoahId)拥有某个长度的byte []数据,否则抛出异常。如果构造函数调用必须是子类构造函数中的第一个语句,我该如何执行此类检查?
使用静态方法创建我的类允许我进行检查,但我仍然需要定义一个显式构造函数。
答案 0 :(得分:7)
您可以在调用super()
后进行检查并抛出异常。如果在构造函数期间的任何时刻抛出异常,该对象将被丢弃并且对调用者不可用。
如果您担心效率,可以编写一个静态方法来执行检查并抛出异常,如下所示:
super((byte) 0 , doChecks(data));
如果没有问题, doChecks
会保持data
不变,否则会引发异常。
答案 1 :(得分:2)
创建构造函数private
,这样只有工厂方法才能看到它,并在工厂方法中进行检查。作为额外的奖励,来自异常的堆栈跟踪将(稍微)更好。
答案 2 :(得分:1)
在调用超类构造函数之后,您总是可以抛出异常。这将中止构造,客户端将无法看到格式错误的对象。或者是否有一些原因导致您无法在不确定数据长度合适的情况下调用基类构造函数?
或者,如果限制始终相同,则可以为基类创建一个执行完整性检查的私有构造函数。
答案 3 :(得分:1)
您的设计是否允许将构造函数设为私有并通过静态create()方法强制构造?
答案 4 :(得分:0)
因为超类构造函数调用必须是构造函数中的第一个语句,所以无法在super();
之前插入语句
您可以在super()
调用后进行检查,如果长度不符合要求,则抛出构造函数调用中止IllegalArgument
异常,将创建并完成子类的实例只有构造函数调用完成。