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
调用后的长度?在我看来,你的第二个选择是最干净、最有效的