2011-03-14 18 views
15

? Podría ayudarme, por favor. Tengo una idea, pero no sé cómo puedo implementarla.¿Podemos interrumpir la creación de un objeto en el constructor

Así que la pregunta es: ¿Podemos interrumpir la creación de un objeto en el constructor es decir

//Code 

SomeClass someClass = new SomeClass(someCriteria); 

Así que si someCriteria no contesta en nuestros requerimientos no hay que crear un objeto y debe devolver null, en vez de nuevo objeto.

¿Es posible implementarlo en C#?

+0

¿Estás preguntando si someCriteria no es un tipo válido para el constructor o si dentro del constructor falla alguna lógica ¿has escrito? Un tipo no válido no se compilaría y, por lo tanto, nunca podría ejecutarse y, por lo tanto, nunca se interrumpirá, aunque me da la sensación de que te refieres a interceptado. – MattC

+0

Aún no sé lo suficiente sobre la inyección de dependencias, pero me pregunto si un marco como Ninject podría interceptar la llamada al constructor y devolver nulo si fuera necesario. Pero probablemente eliminaría los argumentos y lanzaría una excepción como sugieren otros antes de intentar eso. – adam0101

Respuesta

17

mejor manera es una clase de fábrica, pero si su clase es tan pequeño que se puede utilizar esto:

class SomeClass 
    { 
     private string _someCriteria; 

     private SomeClass(string someCriteria) 
     { 
      _someCriteria = someCriteria; 
     } 

     public static SomeClass CreateInstance(string someCriteria) 
     { 
      if (someCriteria.Length > 2) 
      { 
       return new SomeClass(someCriteria); 
      } 
      return null; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 

      // returns null 
      SomeClass someClass = SomeClass.CreateInstance("t"); 

      // returns object 
      SomeClass someClass2 = SomeClass.CreateInstance("test"); 
     } 
    } 
+0

Muchas gracias. ¡Funciona! – Sergey

8

Es posible que desee utilizar una clase de fábrica que cree instancias de SomeClass devolviendo nulo si el someCriteria no es válido.

+1

Esta es una gran respuesta, especialmente cuando se combina con @Jan Zyka – corsiKa

5

Es bastante habitual que compruebe los parámetros del constructor si son válidos. Si no, usualmente lanzas una excepción.

También leí un buen consejo para proporcionar métodos estáticos para validar los parámetros del constructor. Esto permite al usuario de su clase comprobar si lo que va a pasar en el constructor tendrá éxito o no. Aquellos que están seguros de que los parámetros están bien (hicieron algún tipo de validación) irán directamente con el constructor.

Considere también lo que el usuario de su clase posiblemente hará con nulo en lugar del objeto (si se utilizó algún tipo de clase de fábrica). ¿Esto normalmente daría lugar a una NullPointerException en la siguiente línea? Por lo general, es una buena idea detener las cosas incorrectas lo antes posible, en este caso lanzar la excepción y finalizar. Es una solución más limpia que devolver nulo y si alguien realmente quiere (esto definitivamente no será la mejor práctica) aún puede detectar esta excepción ...

+2

Esta es una gran respuesta, especialmente cuando se combina con @bleeeah – corsiKa

2

Si los parámetros de su constructor no son válidos, considere lanzar ArgumentException o uno de sus clases descendientes (por ejemplo, ArgumentOutOfRangeException).

+0

Sí, luego simplemente ajuste su tarea con 'try..catch' y en la asignación' catch' para nulo. –

0

No, no es posible directamente.

Puede lanzar una excepción y agregar el código requerido para verificar la excepción y asignarle nulo a su variable.

Una mejor solución sería utilizar una fábrica que devolvería nulo si alguna condición fallara.

var someClass = SomeClassFactory.Create(someCriteria); 
if(someClass != null) 
{ 
} 
0

Los new garantías constructo que se devolverá un objeto (o una excepción lanzada). Entonces, como lo recomendó Bleeeah, una fábrica o concepto similar le permitirá aplicar su lógica.

1

Eso sería posible. Otra forma sería poner su cuenta de cheques antes de crear el objeto. Al igual que

SomeClass someClass = null; 

if (someCriteria == VALID) 
{ 
    someClass = new SomeClass(someCriteria); 
} 

Espero que esto ayude.

Cuestiones relacionadas