2010-01-29 12 views
15

Se una classe ha un costruttore che accetta un oggetto valore come parametro e si affida a questo per eseguire l'inizializzazione. Come dovrebbe reagire se questo oggetto è nullo?Come deve comportarsi un costruttore quando viene fornito un parametro non valido?

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

Questo è un esempio, ma in generale: come dovrebbe un atto costruttore se viene dato parametri non validi e quindi non può fare la costruzione correttamente? Dovrebbe solo tornare senza fare alcuna inizializzazione? Impostare i parametri su alcuni valori predefiniti? Lanciare un'eccezione? Qualcos'altro?

Sono sicuro che la risposta è "Dipende", ma ci sono delle buone pratiche, ecc.?

risposta

15

Un programmatore deve essere in grado di assumere un oggetto creato correttamente, a meno che non venga sollevata un'eccezione. Il tipo di eccezione dipende dall'argomento, ma deve comunque essere deselezionato. L'ultima cosa che vuoi è che il costruttore non riesca a costruire un oggetto valido e non lo dica al chiamante.

Penso che l'utilizzo di valori predefiniti in un costruttore sia un'abitudine pericolosa.

+0

Sicuramente andrei con questo approccio eccezionale. È il modo più pulito per uscire da questo. – hurikhan77

+2

Io sostengo questo.Avere l'oggetto in uno stato indefinito non ha molto valore. – stiank81

2

Elimina un'eccezione di argomento nullo.

+0

Cosa succede se non è nullo, solo non valido? – NVRAM

+0

Citazione 'Se una classe ha un costruttore che accetta un oggetto valore come parametro e si affida a questo per eseguire l'inizializzazione. Come dovrebbe reagire se questo oggetto è nullo? ' – David

+1

Cosa succede se non è nullo, solo non valido? Quindi lanciare un'eccezione invalidargument, non missilistica – David

3

Sembra che questo sia Java, ma in C++ dovrebbe gettare definitivamente (anche a std::invalid_argument).

Vedere C++ FAQ Lite 17.2.

Immagino che per Java sia esattamente lo stesso.

Nei rari casi in cui le eccezioni di lancio presentano un sovraccarico eccessivo, è necessario tornare e impostare un flag nell'oggetto che non è stato costruito correttamente. Successivamente controllare una funzione membro isValid().

+0

In realtà è C#, ma presumo che questo dovrebbe essere lo stesso per tutte e 3 le lingue - e altro ancora. – stiank81

6

Molto dipende dalla logica aziendale. Se la logica aziendale richiede che SomeValueObject non sia nullo, ovvero non è possibile creare un'istanza SomeClass senza SomeValueObject, il costruttore deve lanciare un'eccezione, probabilmente IllegalArgumentException.

+0

molto appresi !!! –

1

Se il campo è critico, deve generare un'eccezione per indicare che l'oggetto non deve essere utilizzato. Se non è critico, puoi assegnare valori predefiniti.

1

Se un oggetto può avere valori predefiniti non validi, deve inizializzarsi sui valori predefiniti e attendere l'inizializzazione. Ad es., foo.set_values(...). In questo caso, ci dovrebbe essere una query di is_ready() o is_valid() per consentire il controllo prima dell'uso.

Se un oggetto non può assolutamente trovarsi in uno stato di dati non valido, deve generare un'eccezione.

Entrambi questi casi sono cose che ho incontrato.

Problemi correlati