【问题标题】:Typesafe enum in JavaJava中的类型安全枚举
【发布时间】:2010-08-04 13:31:07
【问题描述】:

不确定标题是否具有误导性,但要求如下。

我需要使用字符串值作为自定义注释的输入。使用枚举值时,IDE 会给出

java 属性值必须是常量。

@test("test") // works

@test(Const.myEnum.test.toString()) //java attribute value must be constant

我了解到字符串值不可变的重要性。是否有可能通过枚举(不是公共静态最终字符串破解)实现。

谢谢。

【问题讨论】:

    标签: java enums annotations


    【解决方案1】:

    枚举可以用在注解中。你应该这样做:

    @test(Const.myEnum.test)
    

    假设你已经定义了一个这样的枚举:

    package Const;
    
    public enum myEnum {
        test;
    }
    

    和这样的注释:

    public @interface test {
        myEnum value();
    }
    

    【讨论】:

      【解决方案2】:

      使用enum 应该没有任何问题,问题可能在于您如何声明它或注释。这是一个编译没有任何问题的示例。

      @Retention(RetentionPolicy.RUNTIME)
      @Target({ ElementType.METHOD })
      public @interface MyAnnotation {
      
          MyEnum value();
      
          public enum MyEnum {
              ONE, TWO, THREE, FOUR
          }
      }
      
      public class AnnotationTest {
      
          @MyAnnotation(MyEnum.ONE)
          public void someMethod() {
              //...
          }
      
      }
      

      【讨论】:

        【解决方案3】:

        如果注释在您的控制范围内,请将属性类型设为enum 类型而不是String。否则是不可能的。

        此外,注解与每个 java 类一样,应以大写字母开头(即Test,而不是test):

        // retention, target here
        public @interface Test {
            YourEnum value();
        }
        

        【讨论】:

        • 谢谢..我不能改变注解的定义,所以我猜你断言不可能使用!
        【解决方案4】:

        如果您希望注释参数被限制为枚举类型的值,那么将该类型赋予参数,而不是字符串。枚举类型就是枚举类型,没有办法绕过调用“toString”不是“常量”转换的事实。

        【讨论】:

          【解决方案5】:

          参数不能是方法的结果,即toString()

          但是你应该可以使用枚举常量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-03
            • 1970-01-01
            • 2011-07-02
            • 2020-12-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多