当前位置: 首页 > 面试题库 >

Java中@interface默认声明的用法

鲜于海
2023-03-14
问题内容

我刚刚发现了此功能。

使用“ @interface”语法声明接口可让您输入默认值。

public @interface HelloWorld { 
     public String sayHello() default "hello world";
}

对我来说这是新事物。该默认值应该如何使用。

我找不到对此的引用,因为Java 1.5中“ @”添加之前,www充满了Java接口文档(是.5还是.4中的?)

编辑

感谢您的回答(我已经有点接近“注释”了,因为我已经使用了标签):P

我知道我应该在多年前阅读该文件!!!

许多API需要大量样板代码。 对于....


问题答案:

您刚刚编写了注释。

default特别是关于该语句:之所以使用它,是因为注释和接口不能具有构造函数,因此这是为注释属性设置默认值的唯一方法。根据Java语言规范:

注释类型元素可能具有为其指定的默认值。这是通过在其(空)参数列表后加上关键字default和元素的默认值来完成的。

读取注解时会动态应用默认值。默认值不会编译为注释。因此,即使在进行更改之前已编译的类中,更改默认值也会影响注释(假定这些注释缺少默认元素的显式值)。

我注意到,尽管java.lang.annotation中的所有注释都没有使用默认值。

用法: 您有一个@HelloWorld带有属性的注释sayHello。您可以将其放在这样的类中:

@HelloWorld(sayHello="Hi")
public class MyClass {
}

由于您具有默认值,因此可以将

@HelloWorld
public class MyClass {
}

(请注意,该文档说:“在具有单个元素的注释中,该元素应命名为value”;我相信这样做的唯一原因是,您可以编写@HelloWorld("Hi")而不必命名参数。)

按照书面说明,您的注释可以在任何有效的程序元素(包括方法和变量声明)上使用。您可以使用@Target批注进行更改。

最后,通过设置RetentionPolicy可以决定是应将注释由编译器丢弃,由VM丢弃还是始终保留。

两个可能也很有趣的软件包:javax.annotation和javax.annotation.processing。和这里是使用注释处理源代码分析的一个例子。



 类似资料:
  • 根据我读到的其他问题(为什么重写方法不能抛出比重写方法更广的异常?以及Java方法抛出异常) 我知道子类中的重写方法必须抛出在重写方法中抛出的异常的相同或一个子类。 Java方法总是至少抛出一个类型为exception的异常吗? ...换句话说,编译器添加抛出异常 因此类X将如下所示 我想澄清的是,对于始终添加默认异常处理程序异常这一事实,我没有搞错。 相关问题: IOException与Runt

  • 问题内容: 是否可以在String方法中使用默认参数。代码如下所示: 上面的代码生成错误。有可能纠正吗? 问题答案: 不,您通常这样做的方法是重载这样的方法:

  • 问题内容: 我应该给班级成员这样的默认值吗? 还是这样? 在这个问题中,我发现在两种情况下 是一个定义明确的操作。 我知道第一个方法会给我一个类变量,而第二个方法则不会。但是,如果我不需要类变量,而只需要为实例变量设置默认值,那么这两种方法是否一样好?还是其中一个比另一个更“ pythonic”? 我注意到的一件事是,在Django教程中,他们使用第二种方法声明模型。我个人认为第二种方法更优雅,但

  • 问题内容: 我刚开始读一本Java书籍,就纳闷了。如果未指定,则哪个访问说明符是默认的? 问题答案: 默认可见性称为“ package-private”(尽管您不能显式使用此属性),这意味着可以从该类所属的同一包内部访问该字段。 正如mdma指出的那样,接口成员的情况并非如此,其默认值为“ public”。

  • 问题内容: 声明基元/对象时,它们是否已初始化? 哪些是默认值? 类成员 和 本地字段 的行为是什么? 在类成员上声明对象呢? 如下所示,这些是默认值: 请注意,对象初始化为 null 问题答案: 缺省值为is ,这是它将在JavaSE和JavaEE中具有的值,除非为其分配了另一个值。 Java(或任何其他原语)中不能有未初始化的类成员。 在您的示例中,您显示的是类成员,在另一个示例中,其显示的是

  • 问题内容: 我正在学习Java泛型,我问自己这个问题。 这两个方法声明之间有什么区别? 和 问题答案: 在后者中,您可以引用范围内的类型,即。在前者中,您不需要。