Java子类构造函数
这是一个我需要扩展的外部类:Java子类构造函数,java,Java,这是一个我需要扩展的外部类: public class Binary { public Binary( byte type , byte[] data ){ _type = type; _data = data; } public byte getType(){ return _type; } public byte[] getData(){ return _data; }
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[]数据,否则抛出异常。如果构造函数调用必须是子类构造函数中的第一条语句,我如何执行此类检查
使用静态方法创建类允许我进行检查,但我仍然必须定义显式构造函数 使构造函数
私有
,这样只有您的工厂方法才能看到它并在工厂方法中执行检查。作为额外的好处,来自异常的堆栈跟踪将(稍微)更好。您可以在调用超类构造函数后始终抛出异常。这将中止构造,客户端将无法看到格式错误的对象。或者是因为某种原因,您不能在不确定数据长度正确的情况下调用基类构造函数
或者,如果限制总是相同的,您可以为基类创建一个私有构造函数来执行完整性检查。您可以执行检查并在调用
super()
后引发异常。如果在构造过程中的任何时候抛出异常,则该对象将被丢弃,并且调用方不可用
如果您关心效率,可以编写一个静态方法来执行检查并抛出异常,如下所示:
super((byte) 0 , doChecks(data));
doChecks
如果可以,将返回数据
不变,否则将引发异常。您的设计是否允许使构造函数私有并通过静态create()方法强制构造?因为超类构造函数调用必须是构造函数中的第一条语句,无法在super()之前插入语句代码>
在调用super()
之后,您始终可以执行检查,如果长度不满足要求,则通过抛出IllegalArgument
异常中止构造函数调用,仅当构造函数调用完成时,才会创建和完成子类的实例。为什么不检查super
调用后的长度?在我看来,你的第二个选择是最干净、最有效的