Які плюси та мінуси використання статичних методів створення об'єктів над конструкторами?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
Мало що я можу придумати:
Плюси:
- Повернути null замість викидання виключення (назвіть його
TryCreate). Це може зробити код більш лаконічним та чистим на стороні клієнта. Клієнти рідко очікують, що конструктор вийде з ладу. - Створюйте різні види об’єктів з чіткою семантикою, наприклад,
CreatFromName(String name)таCreateFromCsvLine(String csvLine) - При необхідності може повернути кешований об'єкт або похідну реалізацію.
Мінуси:
- Менш відкритий, складніший для прокрутки коду.
- Деякі зразки, як-от серіалізація або відображення, є складнішими (наприклад
Activator<Foo>.CreateInstance())
Foo x = Foo.TryCreate(); if (x == null) { ... }). Обробка виключення ctor - це ( Foo x; try { x = new Foo(); } catch (SomeException e) { ... }). Під час виклику звичайного методу я віддаю перевагу виняткам з кодів помилок, але зі створенням об'єкта TryCreateздається більш чистим.
Nameта вводити CsvLineтипи, а не виражати вимоги через назви методів. Це дозволить вам перевантажити Create. Використання рядків для обох можна вважати "примітивною одержимістю" (якщо припустити, що ви не зробили цього вибору з відомих причин продуктивності). Ознайомтесь з предметами Каліністики, щоб отримати цікавий спосіб вивчити це.