这是一个我应该使用Java Enum的好例子吗?

时间:2013-12-31 18:50:06

标签: java android enums

在我的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;

3 个答案:

答案 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"; 

这里你实际上有两组东西。你有我认为的列名,然后是一些状态Stringenum就像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

这样,您的代码只会在一个地方定义。更好的是,在一个类名中,可以非常明显地查找现有标签以及应该添加任何新标签的位置。

相关问题