Quali sono i pro e i contro di avere metodi di creazione di oggetti statici sui costruttori?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
Pochi a cui riesco a pensare:
Pro:
- Restituisce null invece di generare un'eccezione (denominarla
TryCreate
). Questo può rendere il codice più conciso e pulito dal lato client. I client raramente si aspettano che un costruttore fallisca. - Crea diversi tipi di oggetti con semantica chiara, ad es.
CreatFromName(String name)
eCreateFromCsvLine(String csvLine)
- Può restituire un oggetto memorizzato nella cache, se necessario, o un'implementazione derivata.
Contro:
- Meno codice individuabile, più difficile da scremare.
- Alcuni pattern, come la serializzazione o il riflesso, sono più difficili (ad esempio
Activator<Foo>.CreateInstance()
)