/**
* A JavaScript value representing a signed integer.
*/
class V8_EXPORT Integer : public Number {
public:
static Local<Integer> New(Isolate* isolate, int32_t value);
static Local<Integer> NewFromUnsigned(Isolate* isolate, uint32_t value);
int64_t Value() const;
V8_INLINE static Integer* Cast(v8::Value* obj);
private:
Integer();
static void CheckCast(v8::Value* obj);
};
上述代碼來自Google的V8引擎。這個例子初始化:爲什麼Google不希望您使用C++構造函數?
Handle<Value> x = Integer::New(42);
從我可以在源代碼中看到,它們標誌着構造爲私有,並希望您能夠使用新的函數來創建該類的實例。這不符合標準的C++設計模式嗎?爲什麼他們不是隻爲構造函數重載而不是創建靜態函數?當人們試圖將圖書館從一種語言移植到另一種語言時,這通常是你看到的那種事情(我現在唯一能想到的就是Xamarin的iOS工具包)。
我試着谷歌周圍的這種類型的約定名稱,但無法找到真正的任何東西。
可能是因爲(這裏瘋狂猜測)整數和其他原始相關類型經常合併以避免不斷創建值? – njzk2
還要注意,工廠方法返回的是一個不同於'new Integer(42)'返回的類型。考慮一下。 – vanza
這種技術通常被稱爲「命名構造函數成語」(因爲你的(命名的)靜態成員函數有效地替換了構造函數,在這種情況下,查看返回類型'New',它不返回'Integer',它返回一個Local'這是因爲他們需要確保它可以映射到它所表示的JavaScript,所以需要一些額外的簿記,並且這是作爲整數的包裝來實現的 –
jalf