2011-01-11 78 views
4

这是一个外部I类需要扩展: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 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 []数据,如果没有则抛出异常。如果构造函数调用必须是子类构造函数中的第一个语句,我该如何执行这种检查?

使用静态方法来创建我的类允许我做检查,但我仍然必须定义一个显式构造函数。

+1

为什么你不检查`super`调用之后的长度?之后您仍然可以抛出错误。 – 2011-01-11 01:40:44

回答

8

您可以在打电话给super()后进行检查并抛出异常。如果在构造函数期间的任何时候抛出异常,该对象将被丢弃并且不可用于呼叫者。

如果你关心效率,你可以写,做了检查,并抛出异常,像这样一个静态方法:

super((byte) 0 , doChecks(data)); 

doChecks将返回data不变,如果它的好,否则会抛出异常。

+0

你的第二个选择在我看来是最干净和高效的 – 2011-01-11 01:59:59

2

使构造函数private只有您的工厂方法可以看到它,并在工厂方法中进行检查。作为额外的奖励,来自异常的堆栈跟踪将(略)更好。

1

您可以在调用超类构造函数后始终抛出异常。这将中止建设,客户将无法看到格式错误的对象。或者是否有一些原因,如果不确定数据的长度是否合适,您就无法调用基类构造函数?

另外,如果限制总是相同的,你可以为你的基类创建一个私有构造函数来完成完整性检查。

1

您的设计是否允许通过静态create()方法将构造函数设为私有并强制构建?

0

因为超类的构造函数调用必须在构造函数中的第一条语句,就没有办法之前​​

你总是可以做super()调用后检查,以插入声明,抛出中止构造函数调用IllegalArgument如果长度不符合要求,则只有在构造函数调用完成时才会创建并完成子类的实例。