2011-01-11 5 views
4

이 내가 확장 할 필요가 외부 클래스 :자바 하위 클래스 생성자

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 [] 데이터를 가지거나 그렇지 않은 경우 Exception을 던집니다. 생성자 호출이 하위 클래스 생성자의 첫 번째 문이어야하는 경우 어떻게 이런 종류의 검사를 수행 할 수 있습니까?

정적 메서드를 사용하여 클래스를 만들면 검사를 수행 할 수 있지만 명시 적 생성자를 정의해야합니다.

+1

왜 '슈퍼'통화 후 길이를 확인하지 않습니까? 나중에 오류가 발생할 수 있습니다. –

답변

8

super()을 호출 한 후에 예외를 검사하고 예외를 throw 할 수 있습니다. 생성자 중 임의의 지점에서 예외가 발생하면 객체는 삭제되고 호출자는 사용할 수 없습니다.

당신이 효율성이 염려되는 경우 검사를 수행하고,이 같은 예외를 발생 정적 방법을 쓸 수있다 : 그렇지 않으면 것, 괜찮아 경우

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

doChecksdata 변경 반환을 예외를 throw합니다.

+0

두 번째 옵션이 가장 깨끗하고 효율적인 것 같습니다. –

+0

doChecks를 정적으로 설정했는지 확인하십시오. 그렇지 않으면 작동하지 않습니다. – Zeki

2

생성자를 private으로 만들어서 공장 방법으로 만이를 볼 수 있고 공장에서 확인하십시오. 추가 보너스로, 예외에서 스택 추적 (약간) 좋네됩니다.

1

수퍼 클래스 생성자를 호출 한 후에 항상 예외를 throw 할 수 있습니다. 그러면 구성이 중단되고 클라이언트는 조작 된 객체를 볼 수 없습니다. 아니면 데이터가 올바른 길이를 가지고 있는지 확인하지 않고 기본 클래스 생성자를 호출 할 수없는 몇 가지 이유가 있습니까?

또는 제한이 항상 동일한 경우 무결성 검사를 수행하는 기본 클래스의 개인 생성자를 만들 수 있습니다.

1

귀하의 설계로 인해 생성자를 비공개로 만들고 정적 create() 메소드를 통해 강제로 구성 할 수 있습니까? 슈퍼 클래스 생성자 호출이 생성자의 첫 번째 문이어야하기 때문에

0

는, 당신은 super() 호출 후 확인을 항상 할 수 super();

전에 문을 삽입하는 방법이 없습니다,을 던져 생성자 호출을 중지 IllegalArgument 예외 길이가 요구 사항을 충족시키지 못하면 생성자 호출이 완료된 경우에만 하위 클래스의 인스턴스가 만들어지고 완료됩니다.