2011-01-11 10 views
4

これは私が拡張する必要が外部のクラスです: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'コールの後に長さをチェックしないのですか?その後もエラーを投げることができます。 –

答えて

8

super()の呼び出しの後に例外をスローすることができます。コンストラクターの実行中に例外がスローされた場合、オブジェクトは破棄され、呼び出し元は使用できなくなります。

あなたは、効率を懸念している場合は、あなたがチェックを行い、例外をスローする静的メソッドを書くことができ、このような何か:それは大丈夫だ場合

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

doChecksdataそのまま戻ってくる、それ以外の場合は、希望例外をスローします。

+0

あなたの2番目の選択肢は私にとって最も清潔で効率的だと思われます。 –

+0

doChecksを静的にすることを忘れないでください。さもなければ動作しません。 – Zeki

2

コンストラクタをprivateにすると、ファクトリメソッドだけがそれを見て、ファクトリメソッドでチェックできます。追加ボーナスとして、例外からのスタックトレースは(やや)良いでしょう。

1

スーパークラスのコンストラクタを呼び出した後に、常に例外をスローすることができます。これにより構築が中止され、クライアントは不正なオブジェクトを見ることができなくなります。または、データの長さが正しいことを確認せずに、基本クラスのコンストラクタを呼び出せないという理由がありますか?

また、制限が常に同じ場合は、整合性チェックを行う基本クラス用の専用コンストラクタを作成できます。

1

あなたの設計では、コンストラクタを非公開にして静的なcreate()メソッドによって強制的に構築することができますか?

0

スーパークラスのコンストラクタ呼び出しは、コンストラクタの最初のステートメントでなければならないので、文を挿入する方法はありませんあなたはいつもsuper()呼び出しの後のチェックを行うことができます​​

前に、投げることによってコンストラクタの呼び出しを中止IllegalArgument例外長さが要件を満たしていない場合、コンストラクタ呼び出しが終了した場合にのみサブクラスのインスタンスが作成され、完了します。

関連する問題