在构造函数上使用静态对象创建方法的利弊是什么?
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()
)
1
慢一点 无论如何,您都必须处理空引用。
—
阿米尔·雷扎伊
@Amir处理null为(
—
dbkk 2010年
Foo x = Foo.TryCreate(); if (x == null) { ... }
)。处理ctor异常为(Foo x; try { x = new Foo(); } catch (SomeException e) { ... }
)。当调用普通方法时,我更喜欢异常而不是错误代码,但是在创建对象时,它TryCreate
看起来更干净。
您会在验证中进行任何类型检查吗?
—
阿米尔·雷扎伊
关于第二个Pro,“使用清晰的语义创建不同种类的对象,例如CreatFromName(String name)和CreateFromCsvLine(String csvLine)”,创建
—
bentayloruk
Name
和CsvLine
键入可能会更好,而不是通过方法名称来表达需求。这将允许您重载Create。对这两者使用字符串可能被认为是“原始痴迷”(假设出于已知的性能原因尚未做出此选择)。查看对象健美操,以有趣的方式探索这一点。