在我的android asynctask中,我有以下代码:
public class AddNewItemToServerAsync extends AsyncTask<String, String, Bundle> {
private static final String TAG_SUCCESS = "success";
private static final String TAG_ITEM_ID = "item_id";
private static final String TAG_TRANSACTION_ID = "transaction_id";
private static final String TAG_TIME_ITEM_WAS_ADDED_TO_DB = "time_product_added";
private static final String TAG_BAD_REQUEST = "Bad request";
private static final String TAG_DB_PROBLEM = "Database Problem";
private static final String TAG_UNKNOWN_PROBLEM = "Unknown Problem";
private void setReason(String reason) {
this.reason = reason;
}
@Override
protected void onPreExecute() {
ShowLoadingMessage.loading(context, Configurationz.LoadingMessages.ADDING_NEW_ITEM_TO_USER_COLLECTION);
}
@Override
protected Bundle doInBackground(String... args) {
//code here
return dataRegardingTheItemJustAdded;
} else if (success == Configurationz.HttpResponses.FAILURE_BAD_REQUEST) {
// report tool
setReason(TAG_BAD_REQUEST);
return null;
} else if (success == Configurationz.HttpResponses.FAILURE_DATABASE_PROBLEM) {
setReason(TAG_DB_PROBLEM);
return null;
} else {
setReason(TAG_UNKNOWN_PROBLEM);
return null;
}
} catch (JSONException e) {
e.printStackTrace();
setReason(TAG_UNKNOWN_PROBLEM);
return null;
}
}
@Override
protected void onPostExecute(Bundle dataRegardingTheItemJustAdded) {
ShowLoadingMessage.dismissDialog();
if (dataRegardingTheItemJustAdded != null) {
if (listener != null) {
listener.onAddNewItemSuccess(dataRegardingTheItemJustAdded);
}
} else {
if (listener != null) {
if (reason != null) {
listener.onAddNewItemFailure(reason);
}
}
}
super.onPostExecute(dataRegardingTheItemJustAdded);
}
}
然后监听器类就像这样:
private static final String TAG_BAD_REQUEST = "Bad request";
private static final String TAG_DB_PROBLEM = "Database Problem";
private static final String TAG_UNKNOWN_PROBLEM = "Unknown Problem";
@Override
public void onAddNewItemFailure(String reason) {
if (reason.contentEquals(TAG_BAD_REQUEST)) {
//toast
} else if (reason.contentEquals(TAG_DB_PROBLEM)) {
//toast
} else if (reason.contentEquals(TAG_UNKNOWN_PROBLEM)) {
//toast
}
}
我认为就两次定义的标签而言,这并未得到很好的优化。我应该在这里使用ENUM,如果答案是肯定的,那该怎么办?
或者我应该将这些标签移动到congfigurationz类并使它们成为经典的静态变量&gt;
答案 0 :(得分:3)
我认为,这是使用Java Enums的完美示例。这不会仅巩固您的标签,它将提供类型安全。
您可以将枚举定义为
public enum Tag {
SUCCESS, ITEM_ID, TRANSACTION_ID // Plus all the other tags
}
并将其用作
@Override
public void onAddNewItemFailure(Tag reason) {
if (Tag.BAD_REQUEST.equals(reason)) {
//toast
} else if (Tag.DB_PROBLEM.equals(reason)) {
//toast
} else if (Tag.UNKNOWN_PROBLEM.equals(reason)) {
//toast
}
}
答案 1 :(得分:3)
enum
对你的常量没有意义,因为它们没有逻辑连接。
private static final String TAG_SUCCESS = "success";
private static final String TAG_ITEM_ID = "item_id";
private static final String TAG_TRANSACTION_ID = "transaction_id";
private static final String TAG_TIME_ITEM_WAS_ADDED_TO_DB = "time_product_added";
private static final String TAG_BAD_REQUEST = "Bad request";
private static final String TAG_DB_PROBLEM = "Database Problem";
private static final String TAG_UNKNOWN_PROBLEM = "Unknown Problem";
这里你实际上有两组东西。你有我认为的列名,然后是一些状态String
。 enum
就像class
一样,应该是一个逻辑上独立且一致的单位。如果你愿意,你当然可以定义两个enum
来捕获两个集合。
public enum TagStatus {
SUCCESS ("Success"),
BAD_REQUEST ("Bad Request"),
DATABASE_PROBLEM ("Database Problem"),
UNKNOWN_PROBLEM ("Unknown Problem");
private final String description;
private TagStatus(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return description;
}
}
......然后......
public enum TagColumn {
ITEM_ID ("item_id"),
// ... and so on
这是很多要添加的框架,这确实是一个主观的设计考虑因素。在许多情况下,简单地将常量公开为public
以供您使用的其余API更有意义。
答案 2 :(得分:1)
你“可以”用Emum解决这个问题,但由于你不需要Enum提供的任何其他功能,我认为不值得增加复杂性。
您可以将标记设为公共标记,并从其他类访问它们。更好的是,定义一个Tags
类并将所有标记放在那里。然后在AddNewItemToServerAsync
课程中,您可以通过以下方式引用标记:Tags.BAD_REQUEST
。
这样,您的代码只会在一个地方定义。更好的是,在一个类名中,可以非常明显地查找现有标签以及应该添加任何新标签的位置。