代码之家  ›  专栏  ›  技术社区  ›  Simon

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

  •  4
  • Simon  · 技术社区  · 6 年前

    在我测试的应用程序(页面对象)中,有很多类表示用户屏幕。每个页面对象都包含不同数量的元素,每个元素都有一个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 回复  |  直到 6 年前
        1
  •  2
  •   ernest_k Petronella    6 年前

    使用 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 .

        2
  •  1
  •   tam    6 年前

    在这种情况下,我可以考虑使用枚举,您仍然可以在代码中引用特定的值,并重写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;
        }
    }
    
        3
  •  1
  •   davidxxx    6 年前

    由于不能在最终变量赋值之后丰富它们的状态,所以我会用另一种方法:提供一个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;
        }
    
    }
    

    请注意,对于枚举,它将更加健壮,因为字符串接受非常大范围的可能值,而枚举则不接受。
    这将需要你改变许多类,但它是值得的。
    欧内斯特的回答很好地说明了这一点。