2010-01-29 6 views
15

Si una clase tiene un constructor que toma algún objeto de valor como parámetro y se basa en esto para hacer su inicialización. ¿Cómo debería reaccionar si este objeto es nulo?¿Cómo debería actuar un constructor cuando se le dan parámetros no válidos?

class SomeClass 
{ 
    private SomeData _data; 
    public SomeClass(SomeValueObject obj) 
    { 
     _data = obj.Data; 
    } 
} 

Este es un ejemplo, pero en general: ¿Cómo debe actuar un constructor si se da parámetros no válidos y por lo tanto no puede hacer la construcción correctamente? ¿Debería regresar sin hacer ninguna inicialización? Establecer los parámetros a algunos valores predeterminados? Lanzar una excepción? ¿Algo más?

Estoy seguro de que la respuesta a esto es "depende", pero ¿hay algunas prácticas recomendadas, etc.?

Respuesta

15

Un programador debe poder asumir que un objeto se ha creado correctamente, a menos que se produzca una excepción. El tipo de excepción depende del argumento, pero, no obstante, debe desmarcarse. Lo último que desea es que el constructor no construya un objeto válido y no le cuente a la persona que llama al respecto.

Creo que el uso de valores predeterminados en un constructor es un hábito peligroso.

+0

Definitivamente voy con este enfoque de excepción. Es la forma más limpia de salir de esto. – hurikhan77

+2

Apoyo esto.Tener el objeto en un estado indefinido realmente no tiene mucho valor ... – stiank81

2

Lanza una excepción de argumento nulo.

+0

¿Qué pasa si no es nulo, simplemente inválido? – NVRAM

+0

Cita 'Si una clase tiene un constructor que toma algún objeto de valor como parámetro y se basa en esto para hacer su inicialización. ¿Cómo debería reaccionar si este objeto es nulo? ' – David

+1

¿Qué pasa si no es nulo, solo inválido? Luego lanza una excepción invalidargument, no cohete ciencia – David

3

Parece que esto es Java, pero en C++ definitivamente debería arrojar (un std::invalid_argument incluso).

Ver C++ FAQ Lite 17.2.

Supongo que para Java es exactamente lo mismo.

En los casos excepcionales en que arrojar excepciones presenta una sobrecarga demasiado grande, debe devolver y establecer una marca en el objeto que no se construyó correctamente. Luego marque la función de miembro isValid().

+0

En realidad es C#, pero supongo que esto debería ser el mismo para los 3 idiomas, y más. – stiank81

6

Mucho depende de la lógica de su negocio. Si su lógica de negocios requiere que SomeValueObject no sea nulo, lo que significa que SomeClass no se pudo crear una instancia sin SomeValueObject, entonces el constructor definitivamente debe lanzar una excepción, probablemente IllegalArgumentException.

+0

muy apreciado !!! –

1

Si el campo es crítico, debe emitir una excepción para indicar que no se debe usar el objeto. Si no es crítico, puede asignar valores predeterminados.

1

Si un objeto puede tener valores predeterminados no válidos, entonces debe inicializar a los valores predeterminados y esperar la inicialización. Por ejemplo, foo.set_values(...). En este caso, debe haber una consulta de is_ready() o is_valid() para permitir la comprobación antes de su uso.

Si un objeto no puede estar absolutamente en un estado de datos no válido, entonces debe lanzar una excepción.

Ambos casos son cosas que he codificado.

Cuestiones relacionadas