1

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で似たようなことをしたいと思っています. 推奨されるモデルである同様のアプローチはありますか?

編集/フォローオン:リフレクションを使用してこれを行う良い方法はありますか?

4

1 に答える 1