在Java中用常量字符串附加每个类字段

时间:2019-02-01 15:30:48

标签: java string field

我正在测试的应用程序(页面对象)中有很多类代表用户屏幕。每个页面对象都包含各种元素,每个元素都有一个ID。我需要声明这些ID。看起来像这样:

public class MessagesScreen extends BasePage {

    private static final String backArrowButtonID      = PACKAGE_NAME_ID + "backArrow";
    private static final String noMessagesImageID      = PACKAGE_NAME_ID + "empty_messages_icon";
    private static final String noMessagesTextViewI    = PACKAGE_NAME_ID + "label_no_documents";
    private static final String errorTextViewID        = PACKAGE_NAME_ID + "text_error_response";
    private static final String progressBarID          = PACKAGE_NAME_ID + "message_list_progress_bar";
    private static final String messagesRecyclerViewID = PACKAGE_NAME_ID + "messageList";
    private static final String swipeRefreshLayoutID   = PACKAGE_NAME_ID + "swipeRefreshLayout";
    private static final String instantMessageLayoutID = PACKAGE_NAME_ID + "item_instant_message_layout";

}

每个ID都需要添加如上所述的环境变量。 我的问题是:是否有所有不必重复此PACKAGE_NAME_ID的好方法?有没有一种方法可以自动将常量字符串分配给每个新的类字段?

3 个答案:

答案 0 :(得分:2)

在此处使用enum可以在许多方面改善您的代码。除了解决当前问题之外,您还将使用正确的常量工具。

enum IdKey {

    BACK_ARROW_BUTTON_ID("backArrow"),
    NO_MESSAGES_IMAGE_ID("empty_messages_icon"),
    NO_MESSAGES_TEXT_VIEW_ID("label_no_documents"),
    ERROR_TEXT_VIEW_ID("text_error_response"),
    PROGRESS_BAR_ID("message_list_progress_bar"),
    MESSAGES_RECYCLER_VIEW_ID("messageList"),
    SWIPE_REFRESH_LAYOUT_ID("swipeRefreshLayout"),
    INSTANT_MESSAGE_LAYOUT_ID("item_instant_message_layout");

    private final String suffix;

    private IdKey(String suffix) {
        this.suffix = suffix;
    }

    public String getSuffix() {
        return BasePage.PACKAGE_NAME_ID + this.suffix;
    }
}

无论您在何处使用字段,都要做的只是致电:

IdKey.BACK_ARROW_BUTTON_ID.getSuffix();

并且代码更加可靠和简洁。您甚至可以将枚举嵌套为MessagesScreen的私有成员。

答案 1 :(得分:1)

在这种情况下,我可能会考虑使用枚举,您仍然可以在代码中引用特定值,并覆盖toString以所需的格式返回消息

我正在测试的应用程序(页面对象)中有很多类代表用户屏幕。每个页面对象都包含各种元素,每个元素都有一个ID。我需要声明这些ID。看起来像这样:

public enum MessagesScreen {
    BACK_ARROW("backArrow"),
    NO_MESSAGES_IMAGE("empty_messages");

    private String value;
    private Messages(String value) {

    this.value = value;
    }

    @Override public String toString() {

      return PACKAGE_NAME_ID + this.value;
    }
}

答案 2 :(得分:1)

由于您无法在最终变量的赋值后丰富其状态,因此我将采取另一种方式:提供一个添加所需前缀的getter。

public class MessagesScreen extends BasePage {

    private static final String backArrowButtonID   = "backArrow";
    private static final String noMessagesImageID  = "empty_messages_icon";
    ///...

    public String getIdWithPrefix(String constantValue){
        return PACKAGE_NAME_ID + constantValue;
    }

}

请注意,使用枚举会更健壮,因为字符串会接受很大范围的可能值,而枚举则不会。
它将需要您更改许多类,但这很有价值。
ernest_k的答案非常清楚。