2011-01-11 8 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) в имеют байт [] данные определенной длины или бросают исключение, если нет. Как я могу выполнить такие проверки, если вызов конструктора должен быть первым оператором в конструкторе подкласса?

Использование статического метода для создания моего класса позволяет мне выполнить проверку, но мне все же нужно определить явный конструктор.

+1

Почему вы не проверяете длину после вызова 'super'? Вы по-прежнему можете сделать ошибку. –

ответ

8

Вы можете сделать проверку и выбросить исключение после вызова super(). Если исключение выбрано в любой момент во время конструктора, объект будет отброшен и недоступен для вызывающих.

Если вы обеспокоены эффективностью, вы можете написать статический метод, который делает чек и бросает исключение, что-то вроде этого:

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

doChecks вернется data неизменным, если это хорошо, в противном случае это было бы выбросить исключение.

+0

Ваш второй вариант кажется мне самым чистым и эффективным –

+0

Удостоверьтесь, что вы делаете doChecks статичным, иначе это не сработает. – Zeki

2

Сделайте конструктор private, так что только ваш заводский метод может его увидеть и выполнить проверку в заводском методе. В качестве дополнительного бонуса трассировка стека из исключения будет (немного) приятнее.

1

Вы всегда можете вызвать исключение после вызова конструктора суперкласса. Это приведет к прекращению строительства, и клиент не сможет увидеть искаженный объект. Или есть причина, по которой вы не можете вызвать конструктор базового класса, не будучи уверенным, что данные имеют правильную длину?

В противном случае, если ограничения всегда одинаковые, вы можете создать частный конструктор для базового класса, который выполняет проверку целостности.

1

Будет ли ваша конструкция позволять сделать конструктор закрытым и принудительно построить конструкцию через статический метод create()?

0

Поскольку конструктор суперкласса вызов должен быть первым оператором в конструкторе, нет никакого способа, чтобы вставить заявление до super();

Вы всегда можете сделать чек после super() вызова, прервать вызов конструктора, бросая IllegalArgument Исключение, если длина не соответствует требованию, экземпляр подкласса будет создан и завершен только в том случае, если вызов конструктора завершен.

Смежные вопросы