Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中用常量字符串追加每个类字段_Java_String_Field - Fatal编程技术网

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

在Java中用常量字符串追加每个类字段,java,string,field,Java,String,Field,在我正在测试的应用程序(页面对象)中,我有很多代表用户屏幕的类。每个页面对象都包含不同数量的元素,每个元素都有一个ID。我需要声明这些ID。它看起来像这样: public class MessagesScreen extends BasePage { private static final String backArrowButtonID = PACKAGE_NAME_ID + "backArrow"; private static final String noM

在我正在测试的应用程序(页面对象)中,我有很多代表用户屏幕的类。每个页面对象都包含不同数量的元素,每个元素都有一个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\u NAME\u ID
?是否有一种方法可以自动将常量字符串分配给每个新的类字段消息。 在我正在测试的应用程序(页面对象)中,我有很多代表用户屏幕的类。每个页面对象都包含不同数量的元素,每个元素都有一个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;
    }
}

在这里使用
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

的私有成员,因为您无法在对最终变量赋值后丰富其状态,所以我会用另一种方式来做:提供一个添加所需前缀的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;
    }

}
请注意,对于枚举,它将更加健壮,因为字符串接受非常大范围的可能值,而枚举不接受这些值。
这将要求您更改许多课程,但这是值得的。

欧内斯特的回答很好地说明了这一点

你有没有考虑过使用它们?你能告诉我们你在哪里使用它们吗?也许你可以在那里加前缀?你的代码绝对没有问题,停止搜索最好的方法,顺便说一句,静态变量应该是大写的,snake
PROGRESS\u BAR\u ID
也许您可以将
getSuffix()
方法的名称更改为,即
getId()
+1,这是一个好主意。无论如何,我喜欢您的答案(谢谢,顺便说一句),但我看到了一个缺点:如果有任何屏幕,它们中的每一个都必须有一个定义了方法和setter的私有枚举。这似乎是很多陈词滥调。是否有任何方法,例如,在字段中添加注释
@Id
,以附加env变量?如果这真的是一种动态功能,那么我不会首先使用字段/属性。您是否考虑过使用在构造函数或初始化块中初始化的字符串集合/映射?