Разве невозможно выполнить инициализацию перед вызовом конструктора суперкласса? - PullRequest
2 голосов
/ 14 января 2009

Я бы хотел, чтобы подкласс определенного суперкласса с определенными параметрами конструктора загружал файл XML, содержащий информацию, которую я затем хотел бы передать суперконструктору. Этого невозможно достичь?

Ответы [ 5 ]

14 голосов
/ 14 января 2009

Как насчет использования фабричного метода? Может быть что-то вроде:

private MyObject(ComplexData data)
{
    super(data);
}

public static MyObject createMyObject(String someParameter)
{
    ComplexData data = XMLParser.createData(someParameter);
    return new MyObject(data); 
}
8 голосов
/ 14 января 2009

Вы можете вызвать статический метод в вызове super (), например,

public Subclass(String filename)
{
    super(loadFile(filename));
}

private static byte[] loadFile(String filename)
{
    // ...
}
2 голосов
/ 14 января 2009

Невозможно, нет. Грязный, потенциально очень.

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

0 голосов
/ 14 января 2009

Мне нравится предложение Мэтьюса. Вариантом этого является создание объектов, которым удалось предварительно загрузить данные, и передать их в конструктор объекта.

Я делаю это в проекте, над которым работаю для клиента. Theres куча конфигурационных файлов, которые необходимо загрузить. У меня также есть соединения с базой данных и веб-сервисами, которые должны быть установлены, прежде чем могут быть построены зависимые объекты.

Это прекрасно работает, это просто, и когда кто-то другой унаследует этот код, он будет просто следовать логике. Это повышает ценность для клиента.

0 голосов
/ 14 января 2009

Мне нравится заводской ответ, но иногда можно сделать что-то вроде:

public MyObject(String parm) {
    super(parseComplex(parm));
}

private static ComplexData parseComplex(String parm) {
    ....
    return new ComplexData(...);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...