鉴于以下代码段:
超级课程实施:
@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?
答案 0 :(得分:6)
你可以
让方法抛出异常(可能需要更大的重构才能处理异常)
使用方法getService
(将返回类型从return false
更改为void
)并在继续之前检查子类中的状态。您还可以返回更详细的状态代码。
让超类将其处理状态设置为子类可以检查的实例变量(boolean
)。这样做的缺点是它引入了可变状态并且不是线程安全的。
(设计越来越糟糕):让超类更新它收到的this.wentWell = true
,并提供一些额外的信息供子类选取(HashMap
)。这类似于servlet过滤器通过设置“请求属性”传递数据的方式。取决于该地图是可更新的(不是这种情况),可能会通过数据注入打开远程攻击(您将内部处理逻辑标志放入可能直接来自谁知道位置的数据结构中。)