Обходной путь Java для подкласса вынужден вызывать super () в конструкторе? - PullRequest
3 голосов
/ 23 июня 2011

Я редактирую программу, которая использует объект RandomAccessFile, и я хочу создать свой собственный класс RandomAccessFile, который использует другой источник данных, отличный от файлового объекта (это объект S3 Amazon webservices, но это не имеет значения)

Я хочу создать класс с именем RandomAccessS3, в котором в качестве суперкласса используется RandomAccessFile, поэтому я могу просто сказать

RandomAccessFile raf = new RandomAccessS3 ();

и, следовательно, оставьте существующий код прежним. Я просто переопределю каждый метод в RandomAccessFile.

Проблема в том, что в конструкторе подкласса RandomAccessS3 я вынужден вызывать конструктор RandomAccessFile, используя super (file, mode), который принимает в качестве параметра имя файла, выдает ошибку и умирает, если файл недействителен.

Я не могу окружить вызов super () блоком try / catch, потому что super должен быть первой строкой в ​​конструкторе. Я мог бы предоставить фиктивный файл, но я не хочу заставлять пользователя делать это. Есть ли простой способ обойти это?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 19 августа 2014

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

Таким образом, все производные должны что-то передавать при создании экземпляров дочерних экземпляров, а передаваемое значение откладывается в родительский класс.Таким образом, вы можете заставить super () всегда вызываться в производных.

3 голосов
/ 23 июня 2011

Нет простого способа обойти это. Конструктор предназначен для того, чтобы убедиться, что экземпляр находится в хорошем / допустимом состоянии, и часть контракта RandomAccessFile заключается в том, что экземпляр связан с действительным файлом.

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

Возможно, лучшим подходом является создание нового интерфейса и обновление ссылок из RandomAccessFile на новый интерфейс. Затем реализуйте интерфейс дважды, один раз с помощью RandomAccessFile и один раз с вызовами S3.

...