gpt4 book ai didi

java - 为什么java注解语法有()[括号]?

转载 作者:行者123 更新时间:2023-12-01 16:52:31 27 4
gpt4 key购买 nike

为什么在“java”中,当你声明“注释”的“参数”时,必须在参数后面放置“一对括号”,注释在语法上与“接口(interface)”形式“非常不同”,所以为什么这很奇怪语法...我知道这与注释是使用幕后接口(interface)或其他东西进行管理的有关,但到底是什么?

最佳答案

这是正常的接口(interface)声明的样子:

public interface Example {
String method();
}

请注意,当注释发布时,java 功能“接口(interface)的默认方法”尚未出现。 default 关键字已经存在(并且自 java 1.0 起就存在),仅作为可以放入 switch block 中的东西,作为“它与任何情况都不匹配”的“情况”。

这就是注释接口(interface)定义的样子:

public @interface Example {
String method();
}

或者,如果涉及默认值:

public @interface Example {
String method() default "";
}

请注意,除了“@”符号之外,这两者之间的解析方式没有任何区别。在“默认”情况下;是的,这是全新的,但仅看这一点,看起来并不奇怪。括号是,但不是那一点。

这样做的原因是为了不“爆炸”解析。自从java9中引入了module-info以来,如果你想为java编写一个解析器,你通常需要一个“动态切换模式”解析器;模块文件的“语言规范”非常不同。

但这是一大步;绝大多数解析器库都不能很好地处理这个问题,它们无法在解析源文件的过程中切换语法。

即使我可以打响指并破坏java(要明确的是,java通常不会这样做:更新语言,以便现有代码现在不再编译或意味着其他东西是很少采取的重大步骤原因显而易见。不过,它限制了语言设计。这就是成为世界上最流行语言的成本*)...这里有优势。

注释的工作方式是,如果您在运行时获得一个注释,它的作用就像一个作为注释接口(interface)实例的对象:

Example foo = Class.forName("foo.bar.Baz").getAnnotation(Example.class);
System.out.println(foo.method());

注意它不是foo.method。它是foo.method()。这有不同的原因:在 java 中,字段是二等公民。你不能将它们放在 lambda 方法引用中(ClassName::methodName 是有效的 java;字段没有这样的东西),它们不继承,你不能将它们放在接口(interface)中(字段接口(interface)中的方法自动是公共(public)的、最终的和静态的,即常量。与接口(interface)中的方法不同,它们不会对任何实现类提出要求。这意味着作为一般原则的字段不会在 java 的公共(public) API 中使用。如果在这种情况下他们是这样的话那就太奇怪了。

因此,鉴于参数的行为类似于无参数方法调用,从这个意义上说,您在 @interface 定义中也以这种方式声明它们是很方便的。

*)给予或拿走一些名额。

关于java - 为什么java注解语法有()[括号]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61661257/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com