Java 中的类型安全枚举

发布于 2024-09-12 10:54:18 字数 310 浏览 4 评论 0原文

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

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

java属性值必须是常量。

@test("test") // works

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

我读到了字符串值不可变的重要性。是否可以通过枚举来实现(而不是公共静态最终字符串黑客)。

谢谢。

Not sure whether the title is misleading, but requirement is below.

I need to use a string value as input to a custom annotation. When use an enum value, the IDE gives

java attribute value must be constant.

@test("test") // works

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

I read about the importance of the string value being immutable. Is it possible to achive through enum (not the public static final String hack).

thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

不疑不惑不回忆 2024-09-19 10:54:18

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

@test(Const.myEnum.test)

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

package Const;

public enum myEnum {
    test;
}

和这样的注释:

public @interface test {
    myEnum value();
}

Enums can be used in annotations. You should do it like this:

@test(Const.myEnum.test)

assuming you have defined an enum like this:

package Const;

public enum myEnum {
    test;
}

and the annotation like this:

public @interface test {
    myEnum value();
}
凉薄对峙 2024-09-19 10:54:18

使用 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() {
        //...
    }

}

There shouldn't be any problem using an enum, the issue might be with how you are declaring it or the annotation. Here is an example that compiles without any issue.

@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() {
        //...
    }

}
十二 2024-09-19 10:54:18

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

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

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

If the annotation is within your control, make the attribute type be an enum type instead of String. Otherwise it is not possible.

Also, the annotation, as every java class, should start with upper-case (i.e. Test, not test):

// retention, target here
public @interface Test {
    YourEnum value();
}
一张白纸 2024-09-19 10:54:18

如果您希望将注释参数限制为枚举类型的值,请将该类型指定给参数,而不是字符串。枚举类型就是枚举类型,并且无法回避调用“toString”不是“常量”转换这一事实。

If you want the annotation parameter to be restricted to values of an enum type, then give that type to the parameter, not String. An enum type is an enum type, and there's no way around the fact that calling "toString" is not a "constant" transformation.

反话 2024-09-19 10:54:18

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

但您应该能够使用枚举常量。

The parameter must not be the result of a method, i.e. toString()

But you should be able to use the enum constants.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文