2010-11-04 20 views
5
class A{ 

A(int i){ 
} 
} 

A obj=new A(1); 

mientras que la creación de objetos si paso números positivos objeto debe ser creado. A obj = new A (-1); Si se pasan números negativos, el objeto no se debe crear.Creación de referencia nula

Cómo adjsut el constructor para hacer esto

Respuesta

9

Si no desea que un objeto que se cree, no llame new. Si llama newsiempre crea un objeto, incluso si luego se descarta debido a una excepción. Si solo desea evitar que la persona que llama desde reciba un objeto como resultado de la llamada al constructor, puede hacer que su constructor genere una excepción. Si lo desea solo para recibir una referencia nula, no puede hacer eso en un constructor.

Sin embargo, usted podría tener un método estático en su lugar, que luego condicionalmente llamadas new o vuelve nulo:

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

Puede utilizar Null Object patrón. En ese caso, se creará el objeto pero con estado nulo lógico.

3

Como alternativa a Jon Skeet (obviamente) excelente respuesta, también puede lanzar una excepción desde el constructor:

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); 

De esta manera, se construirá el objeto (como constructor, por haber sido llamado, asegura objeto existe), pero indicará claramente que no es utilizable.

0

Existen varios enfoques:

  1. La lógica en función del valor de i encapsulado en el mismo nivel. En este caso es necesaria la comprobación de la condición, incluso si se devuelve un valor nulo:
     
    A a = createAInstance(i); 
    if(a == null) { // do something } 
    else { // do something else } 
    
    lo que dependiendo del algoritmo se puede comprobar el estado en el nivel en el que utiliza A a:
     
    if(i >= 0) { A a = new A(i); // do something } 
    else { // do something else } 
    
  2. La lógica se implementa en una única: utilizar Null Objeto para implementar un stub nulo para A, y el código que trata con una instancia A no debe sentir la diferencia;
  3. la lógica es mixta: use Objeto nulo como en 2.
Cuestiones relacionadas