iOS (Objective-C) の場合、すべてのクラスにはload()
、クラスがロードされたときに呼び出されるメソッドがあります。iOS は、アプリの起動時にすべてのクラス (または少なくともload()
メソッドが定義されているすべてのクラス) をロードするようです。
私はいくつかの iOS プログラムでこれを利用して、ハンドラー クラスを一元化されたメッセージ ハンドラーに登録しました。たとえば、メッセージ タイプを受け取り、ハンドラー クラスを使用して各メッセージに固有のインスタンス オブジェクトを作成します。
これを使用load()
すると、すべてのクラスをどこかにリストして手動で呼び出すことなく、コードで自動登録を行うことができます。ある意味で、エラーが発生しにくくなります。
コード例を次に示します。
特殊化されたペイロード オブジェクト (更新ペイロード クラス):
@implementation
+(void)load
{
[Payload registerMessageName:@"Update"
forMessageKind:kPayloadUpdate
withPayloadHandler:[Update class]];
}
ペイロード メッセージ ハンドラ
static NSMutableDictionary *s_payloadFactoryDict = nil;
static NSMutableDictionary *s_kindToNameMap = nil;
static NSMutableDictionary *s_nameToKindMap = nil;
@implementation
+(void)registerMessageName:(NSString *)messageName
forMessageKind:(PayloadKind)kind
withPayloadHandler:(Class)handlerClass
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
s_payloadFactoryDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil];
s_kindToNameMap = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil];
s_nameToKindMap = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil];
});
NSNumber *kindNum = [NSNumber numberWithInt:kind];
[s_nameToKindMap setObject:kindNum
forKey:messageName];
[s_kindToNameMap setObject:messageName
forKey:kindNum];
[s_payloadFactoryDict setObject:handlerClass
forKey:kindNum];
}
私は今、Android / Javaで似たようなことをしたいと思っています. 推奨されるモデルである同様のアプローチはありますか?
編集/フォローオン:リフレクションを使用してこれを行う良い方法はありますか?