【问题标题】:Append every class field with a constant string in Java在Java中为每个类字段附加一个常量字符串
【发布时间】:2019-02-01 15:30:47
【问题描述】:

在我正在测试的应用程序(页面对象)中,我有很多代表用户屏幕的类。每个页面对象都包含不同数量的元素,其中每个元素都有一个 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?有没有办法自动将常量字符串分配给每个新的类字段?

【问题讨论】:

  • 您是否考虑过使用reflection
  • 你能告诉我们你在哪里使用它们吗?也许您可以在其中添加前缀?
  • 你的代码绝对没有问题,停止寻找最好的方法,顺便说一句,静态变量应该是大写的,snake...PROGRESS_BAR_ID

标签: java string field


【解决方案1】:

在此处使用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 的私有成员。

【讨论】:

  • 也许您可以将 getSuffix() 方法的名称更改为即 getId() +1 以获得一个好主意
  • 我喜欢你的回答(顺便说一句,谢谢),但我看到一个缺点:拥有 maaany 屏幕,每个屏幕都必须有一个私有枚举,其中定义了一个方法和一个 setter。这似乎是很多样板。有什么办法吗?在字段中添加注释@Id,这将附加环境变量?
  • 如果这真的是一种动态的功能,那么我不会使用字段/属性开始。您是否考虑过使用在构造函数或初始化块中初始化的字符串集合/映射?
【解决方案2】:

在这种情况下我可能会考虑使用枚举,您仍然可以在代码中引用特定值并覆盖 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】:

    由于您无法在最终变量赋值后丰富它们的状态,我会以另一种方式做事:提供一个添加所需前缀的 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 的答案很好地表明了这一点。

    【讨论】:

      猜你喜欢
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多