10

コールバックハンドラーの匿名内部クラスを定義するコードがあります。このハンドラーはローカル変数を割り当てる必要があります。以下を参照してください。コールバックで割り当てrespて、関数の終わりに向かって参照する必要があります。ただし、Eclipseでこのエラーが発生します。

最後のローカル変数respは、囲み型で定義されているため、割り当てることができません

どうすればこれを修正できますか?

DoorResult unlockDoor(final LockableDoor door) {
    final UnlockDoorResponse resp;
    final boolean sent = sendRequest(new UnlockDoorRequest(door), 
       new ResponseAction() {
        public void execute(Session session) 
               throws TimedOutException, RetryException, RecoverException {
            session.watch(UNLOCK_DOOR);
            resp = (UnlockDoorResponse)session.watch(UNLOCK_DOOR);
        }
    });
    DoorResult result;
    if (!sent) {
        return DoorResult.COMMS_ERROR;
    }
    else {
        return DoorResult.valueOf(resp.getResponseCode());
    }
}
4

4 に答える 4

5

あなたの場合に役立つハックは次のとおりです。

DoorResult unlockDoor(final LockableDoor door) {
    final UnlockDoorResponse resp[] = { null };
    final boolean sent = sendRequest(new UnlockDoorRequest(door), new ResponseAction() {
        public void execute(Session session)  throws TimedOutException, RetryException, RecoverException {
            session.watch(UNLOCK_DOOR);
            resp[0] = (UnlockDoorResponse)session.watch(UNLOCK_DOOR);
        }
    });
    DoorResult result;
    if (!sent) {
        return DoorResult.COMMS_ERROR;
    }
    else {
        return null == resp[0] ? null : DoorResult.valueOf(resp[0].getResponseCode());
    }
}

ただし、よりクリーンなソリューションが必要な場合は、ハンドラーの名前付きクラスを定義し、そのフィールドに応答を格納し、アクセサー メソッドを使用してそれを取得する必要があります。

よろしく、スタン。

于 2011-01-25T20:18:05.860 に答える
3

これを回避するには、応答のラッパークラスを作成します。

class ResponseWrapper {
    UnlockDoorResponse resp;
    void setResponse(UnlockDoorResponse resp) {
        this.resp = resp;
    }
    UnlockDoorResponse getResponse() {
        return resp;
    }
}

次に、コードは次のようになります。

final ResponseWrapper respWrap = new ResponseWrapper();
final boolean sent = sendRequest(new UnlockDoorRequest(door), new ResponseAction() {
    public void execute(Session session)  throws TimedOutException, RetryException, RecoverException {
        session.watch(UNLOCK_DOOR);
        respWrap.setResponse((UnlockDoorResponse)session.watch(UNLOCK_DOOR));
    }
 });
DoorResult result;
if (!sent) {
    return DoorResult.COMMS_ERROR;
}
else {
    return DoorResult.valueOf(respWrap.getResponse().getResponseCode());
}
于 2011-01-25T20:14:42.003 に答える
1

これが変更するコードであると仮定すると、変更sendRequestResponseAction.executeてインスタンスを返すのはどうですかUnlockDoorResponse

DoorResult unlockDoor(final LockableDoor door) {
    final UnlockDoorResponse resp = sendRequest(new UnlockDoorRequest(door), new ResponseAction() {
        public UnlockDoorResponse execute(Session session)  throws TimedOutException, RetryException, RecoverException {
            session.watch(UNLOCK_DOOR);
            return (UnlockDoorResponse)session.watch(UNLOCK_DOOR);
        }
    });
    if (resp == null) {
        return DoorResult.COMMS_ERROR;
    }
    else {
        return DoorResult.valueOf(resp.getResponseCode());
    }
}
于 2011-01-25T20:17:44.713 に答える
0

結果を返す場合は、匿名の内部クラスではなく、名前付きの内部クラスを使用してください。提示された他のすべてのオプションは、私見の醜いハックです (1 つは自己認めています ;-)

(OK、@ Joel はそうではありませんが、実装しているインターフェイスを変更できると想定しています)

結果のゲッターを使用してクラスのインスタンスを作成するだけです。これはクリーンで、単一のクラスを実装するだけで済みます。

    class MyReponseAction implements ResponseAction {
        private UnlockDoorResponse response; 

        public void execute(Session session)  throws TimedOutException, RetryException, RecoverException {
           session.watch(UNLOCK_DOOR);
           response = (UnlockDoorResponse)session.watch(UNLOCK_DOOR);
        }

        UnlockDoorResponse getResponse() {
            return response;
        }
    }

   DoorResult unlockDoor(final LockableDoor door) {
        ResponseAction action = new MyResponseAction();
        final boolean sent = sendRequest(new UnlockDoorRequest(door), action);

        DoorResult result;
        if (!sent) {
            return DoorResult.COMMS_ERROR;
        }
        else {
            return DoorResult.valueOf(action.getResponse().getResponseCode());
        }
    }
于 2011-01-25T21:05:40.880 に答える