2012-04-01 2 views
1

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

ответ

8

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

MyObject myObject = MyObjectFactory.createMyObject(); 
+2

+1, пожалуйста, сделайте это вместо того, чтобы бросать в конструктор. –

+0

Да, хорошее время, чтобы попрактиковаться в фабричной схеме! – Tombola

2

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

1

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

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

4

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

В 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's answer и создайте фабричный метод, который возвращает null, если объект не будет «правильным».

public class RomanFactory { 

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

} 

Вы должны проверить нуль-х, хотя, иначе программа может привести к сбою с NullPointerException.

0

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

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