目前能想到的最完善的方案和这个类似:
要求Foo类必须包含一个不带参的构造函数,这样的话,构造完成之后,用到的地方不用再把参数塞进getInstance里。
和这个答主说的一样,问题在于,一般我们想把Foo做成单例时,如果Foo包含带参数的构造函数,意味着我们想直接通过参数构造一个全局唯一的实例。但是根据上一段话,我们也希望它同时包含不带参的构造函数方便后续调用。
但这样一来,这个不带参的构造函数的意义并不在于"构造",实际上我们期望不通过它来构造,就显得很不自然。而且可能一上来误用不带参的 ctor 导致这个单例没构造成功。
我期望的用法是:
Foo包含一个带参构造函数(比如Foo::Foo(int a)),只能通过它来构造;- 如果程序第一次执行的是
Foo::getInstance(123),则成功构造,后续应当支持Foo::getInstance()这种简便写法; - 如果程序第一次执行的是
Foo::getInstance(),则报错,停止构造
目前想到的在无参的Foo::Foo()中,直接抛异常。这样能满足以上需求,但是却很不优雅,希望Foo类不动,通过修改singleton来实现。
想了一晚上了,没想出好办法。