Может ли конструктор прервать инстанцирование? - PullRequest
1 голос
/ 01 апреля 2012

Я хочу сделать тесты в конструкторе, чтобы выяснить, является ли в настоящее время хорошей идеей создание объекта или нет, с заданными параметрами.Но как я могу прервать и вернуть предупреждение от конструктора к новому утверждению?Должны ли такие тесты проводиться вызывающей стороной перед каждым «новым» оператором?Я думал, что конструктор будет хорошим местом для этого.

Ответы [ 5 ]

9 голосов
/ 01 апреля 2012

Вместо этого вы можете использовать фабричный объект.Это может затем запустить ваши проверки и вернуть инстансированный объект или null.Это, вероятно, будет более эффективным, чем исключение.

MyObject myObject = MyObjectFactory.createMyObject();
5 голосов
/ 01 апреля 2012

Да, вы вызываете исключение в конструкторе.

В java вы обычно выбрасываете IllegalArgumentException, если один из аргументов был неправильным, что на самом деле обычно делают в качестве защитного выражения:

public class Roman {

    public Roman(int arabic) {

        // "Guard statement" in the beginning of the constructor that
        // checks if the input is legal
        if (arabic < 0) {
            throw new IllegalArgumentException("There are no negative roman numerals");
        }

        // Continue your constructor code here

    }

}

Если вам не нужны исключения, вы можете сделать как ответ GavinCatelli и создать фабричный метод, который возвращает ноль, если объект не будет «правильным».

public class RomanFactory {

    public static Roman getSafeRoman(int a) {
        Roman r;
        try {
            r = new Roman(a);
        } catch(IllegalArgumentException e) {
            r = null;
        }
        return r;
    }

}

Тем не менее, вы должны проверить наличие нулевых значений, иначе программа может аварийно завершить работу с NullPointerException.

2 голосов
/ 01 апреля 2012

Единственный верный способ прервать построение объекта - это сгенерировать исключение до завершения конструктора

1 голос
/ 01 апреля 2012

Конструктор может выдать исключение, если параметры недопустимы.

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

0 голосов
/ 01 апреля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...