如何从java中的超类方法停止/退出子类方法执行

时间:2016-08-21 01:32:31

标签: java android design-patterns

鉴于以下代码段:

超级课程实施:

@Override
    public void onDone(String taskName, JSONObject receivedData, @Nullable HashMap<String, String> sentData) {
        //checks the status for all done process decides to call the presenter failed or success
        try {
            boolean success = receivedData.getString("status").equals("success");
            if(!success){
                this.presenter.error(receivedData.getString("reason"));
            }
        }catch (JSONException ex){
            ex.printStackTrace();
            this.presenter.error("An error occurred");
        }
    }

子类实现::

@Override
    public void onDone(@NonNull String taskName, @NonNull JSONObject receivedData,
                       @Nullable HashMap<String, String> sentData) {
        super.onDone(taskName, receivedData, sentData);
        //the expected data has been received we should act upon it
        //this DAO should know all the type of taskName it can handle and if it finds any that doesn't
        //matches any of its command let it exit
        Log.e(TAG, "Response : "+receivedData);
        Toast.makeText(this.presenter.getContext(), "Done with task", Toast.LENGTH_LONG).show();
        if(sentData!=null){
            sentData.clear();
            sentData = null;
        }
    }

我想要的是,只要 super.onDone 方法检测到错误,该过程应该在那里结束,不应该打扰运行子类方法的主体,是可能在JAVA?

1 个答案:

答案 0 :(得分:6)

你可以

  • 让方法抛出异常(可能需要更大的重构才能处理异常)

  • 使用方法getService(将返回类型从return false更改为void)并在继续之前检查子类中的状态。您还可以返回更详细的状态代码。

  • 让超类将其处理状态设置为子类可以检查的实例变量(boolean)。这样做的缺点是它引入了可变状态并且不是线程安全的。

  • (设计越来越糟糕):让超类更新它收到的this.wentWell = true,并提供一些额外的信息供子类选取(HashMap)。这类似于servlet过滤器通过设置“请求属性”传递数据的方式。取决于该地图是可更新的(不是这种情况),可能会通过数据注入打开远程攻击(您将内部处理逻辑标志放入可能直接来自谁知道位置的数据结构中。)