Singletons エクステンション¶
Fabric Engine version 2.4.0
Copyright (c) 2010-2017 Fabric Software Inc. All rights reserved.
Singletons エクステンション は、1つの演算子や別のスコープからKLオブジェクトを永続化する方法を提供します。オブジェクトは、ユーザーには理解できない静的C++マップ内に格納されます。これの使用例として、 InlineDrawing エクステンション は InlineDrawing シングルトンを格納します。
注釈
グローバルマップにKLオブジェクトの保存ができます。KL構造体ではありません。Singleton_set 、 Singleton_has や Singleton_get
注釈
Fabric Engine のバージョン1.12.0から実装のシングルトンは、コアクライアントを閉じるときに自動的に破棄されます。require Singletons;
object MySettings {
/// \internal
String values[String];
};
function MySettings.set!(String key, String value) {
this.values[key] = value;
}
function String MySettings.get!(String key) {
return this.values.get(key, '');
}
function setupSettings() {
MySettings settings = MySettings();
settings.set('language', 'english');
settings.set('localization', 'us');
// in this function's scope we create an object and
// store it in the singletons extension's memory.
// note that it otherwise would run out of scope and
// get destroyed.
Singleton_set('settings', settings);
}
operator entry() {
setupSettings();
// check if we have the singleton in this scope.
if(Singleton_has('settings')) {
MySettings settings = Singleton_get('settings');
if(!settings) {
setError('Singleton settings is set, but not of KL type MySettings!');
} else {
report('Language setting: '+settings.get('language'));
report('Localization setting: '+settings.get('localization'));
}
}
}
/*
** Output:
Language setting: english
Localization setting: us
*/
シングルトン単体テストの一例
/*
** Example: Singletons_Test1.kl
*/
require Singletons;
object MySingleton {
String name;
};
operator entry() {
MySingleton someSingleton = MySingleton();
someSingleton.name = 'test';
report(someSingleton);
Singleton_set('someSingleton', someSingleton);
someSingleton = null;
report(someSingleton);
someSingleton = Singleton_get('someSingleton');
report(someSingleton);
}
/*
** Output:
{name:"test"}
null
{name:"test"}
*/