2010-11-04 5 views
5
class A{ 

A(int i){ 
} 
} 

A obj=new A(1); 

при создании объекта, если я передаю положительные числа, объект должен быть создан. A obj = новый A (-1); Если переданные числа передаются, объект не должен быть создан.Создание нулевой ссылки

Как adjsut конструктор, чтобы сделать это

ответ

9

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

Однако, вы могли бы иметь статический метод вместо этого, который затем условно вызовов new или возвращают:

public class A 
{ 
    public static A createIfNonNegative(int i) 
    { 
     return i < 0 ? null : new A(); 
    } 
} 
3

Вы можете использовать Null Object шаблон. В этом случае объект будет создан, но с логическим нулевым состоянием.

3

В качестве альтернативы Джон Скит (очевидно) отличный ответ, вы можете также бросить исключение из конструктора:

class A{ 

    A(int i){ 
     if(i<0) { 
      throw new NumberBelowZeroException(i); // implementation of this exception is left as an exercise 
     } 
    } 
} 

A obj=new A(1); 

Таким образом, объект будет построен (как конструктор, с помощью того, был вызван, обеспечивает объект существует), но он будет ясно указывать, что он неприменим.

0

Есть несколько подходов:

  1. Логика в зависимости от значения i инкапсулированных на том же уровне. В этом случае проверка состояния требуется, даже если она возвращает нуль:
     
    A a = createAInstance(i); 
    if(a == null) { // do something } 
    else { // do something else } 
    
    так что в зависимости от алгоритма, вы можете проверить состояние на уровне, где вы используете A a:
     
    if(i >= 0) { A a = new A(i); // do something } 
    else { // do something else } 
    
  2. Логика реализована в только: использование Null Объект для реализации нулевой заглушки для A, а код, относящийся к экземпляру A, не должен ощущать разницу;
  3. Логика смешанная: используйте нулевой объект, как в 2.
Смежные вопросы