-1

少し改良が必要なカウボーイ コードがあります。巨大なハードコーディングされた switch ステートメントを恥じることなく、ドキュメンテーション ログを改善したいと考えています。

次のコードでは、ユーティリティを呼び出してインターフェイスと値を渡し、その値に初期化されたフィールドの名前を返すようにしたいと考えています。したがって、インターフェイスに public static int ONE = 1 がある場合、(T,1) の戻り値は "ONE" になります。このような:

public interface SOBConstants
{
    public static final int EVENT_WILLIE      = 0;
    public static final int EVENT_LOPEZ       = 1;
    public static final int EVENT_GETS_HIS    = 2;
    public static final int EVENT_DUE         = 3;
}

public class Mordecai implements SOBConstants
{
    public void handleEvent(int eventid )
    {
        // Existing log entry:
        log.debug("Handling event" + id );

        // New log entry:
        log.debug("Handling event " + Utils.eventName( SOBConstants, eventid );
        // Should output "Handling event EVENT_WILLIE", etc.

        switch( eventid )
        {
            case EVENT_WILLIE :
                super.attachVictim();
                break;
            case EVENT_LOPEZ :
                super.confirmVictim();
                break;
            case EVENT_GETS_HIS :
                super.openStreetFader();
                break;
            case EVENT_DUE :
                super.animateDescent();
                super.playOutro();
                break;
            default :
                super.detachAndContinueSearch();
        }
        return;
    }
}

public class Utils
{
    public static String eventName(Object container, int eventID)
    {
        String s = "";

        if( container != null )
        {
            Field[] flist = container.getClass().getDeclaredFields();
            for (Field f : flist )
                if( f.getType() == int.class )
                    try {
                        if( f.getInt(null) == eventID ) {
                            s = f.getName();
                            break;
                        }
                    } catch (IllegalArgumentException e) {
                    } catch (IllegalAccessException e) {
                    }
        }
        return s;
    }
}

Utils.eventName を記述 (または呼び出し) して、任意のインターフェイスを渡し、値も渡されるフィールド名をスキャンできるようにするにはどうすればよいですか? 実装クラスを渡すのではなく、インターフェイスに焦点を当てたいと思います。これには、追加の識別子を追加する必要があるためです。現在、フィールド リストはどちらの方法でも空です。

または、これはそのままで問題ありません。次のように呼び出す必要があります

Utils.getName(new SOBConstants(){}, 3 );

また、注意:実際の列挙型を使用することを検討しましたが、これは問題ない時間/労力の暫定的な改善のようです (数百の定数があります)。 したがって、列挙型を提案しないでください。関係ありません。

ありがとう!HS

4

1 に答える 1