java - Java 枚举值如何用作真正的静态常量

标签 java oop static enums

好吧,所以我对常量以及应该如何设计和使用它们进行了一些研究。对于我的应用程序,使用大量枚举对彼此相关的术语进行分组是有意义的。

我的想法是,当我开发具有数百个参数(其中许多被多次使用)和方法的 Web 服务时,我可以使用枚举值进行注释。在此之前,有一个巨大的、令人作呕的 Constants 文件,其中包含冗余且无人维护的值。

所以,这是我想使用的枚举:

package com.company.ws.data.enums;

/** This {@link Enum} contains all web service methods that will be used. **/
public enum Methods {

    /** The name of the web service for looking up an account by account number. **/
    FIND_ACCOUNT_BY_ACCOUNT_NUMBER("accountByNumberRequest");

    /** The String value of the web service method name to be used in SOAP **/
    private String value;

    private Methods(String value) {
        this.value = value;
    }

    /**
     * @return the String value of the web service method name to be used in
     *         SOAP
     */
    public String getValue() {
        return this.value;
    }
}

这是我想使用它的地方:

package com.company.ws.data.models;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import com.company.ws.data.enums.Methods;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = **Methods.FIND_ACCOUNT_BY_ACCOUNT_NUMBER**, namespace = "com.company.ws")
public class AccountByNumberRequest{
}

所以,如果我尝试上面的方法,我会得到错误 Type mismatch: cannot convert from Methods to String 这很有意义。那么,让我们尝试访问枚举的实际值:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = **Methods.FIND_ACCOUNT_BY_ACCOUNT_NUMBER.getValue()**, namespace = "")
public class AccountByNumberRequest extends RequestByAccount {
}

这样做时,我收到此错误消息:注释属性 XmlRootElement.name 的值必须是常量表达式

那么,我可以像我尝试的那样使用枚举吗?它们可以用来代替最终类中定义的真正静态常量值吗?或者我是否处于某种奇怪的编译时状态,在枚举本身被加载并用它的值实例化之前评估注释?指导资源:http://www.javapractices.com/topic/TopicAction.do?Id=1

最佳答案

不,你不能。根据 JLS,Methods.getValue() 的值不是常量表达式,这是编译器告诉您的内容。

关于java - Java 枚举值如何用作真正的静态常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19938633/

相关文章:

java - Jsoup:在无 CSS 的 HTML 中提取两个 block 之间的所有 HTML

java - 在 JFrame 中创建 GUI 以进行冒泡、插入和快速排序,并将代码添加到执行的操作中

java - Spring/RMI 服务器错误

java - 从地址获取对象

java - 抽象类中的静态方法

java - Spring Cloud 流: dynamic output channel strange behavior

C++ 方法与类的链接

java - 如何在java中将对象添加到ArrayList

java - 在简单单例实例化中获取 ExceptionInInitializerError

java - 使用 Singleton 类中的静态 GSON 对象将 Java 对象序列化为 JSON