我正在尝试学习Servlet注释并遇到了这个片段
@WebServlet(urlPatterns="/MyPattern", initParams={@WebInitParam(name="ccc", value="333")})
这对我有意义。但是,我不明白为什么它不像这样
@WebServlet(urlPatterns="/MyPattern", initParams={(name="ccc", value="333"), (name="abc", value="1")})
所以,问题是当我们已经将属性声明为@WebInitParam
时,我们需要放置initParams
注释。对我来说这似乎是多余的,或者我错过了什么?
答案 0 :(得分:0)
你建议的替代方案甚至不会编译。
当您查看JLS时,它会说明:
如果声明的方法的返回类型,则是编译时错误 注释类型不是以下之一:基本类型, String,Class,Class的任何参数化调用,枚举类型 (§8.9),注释类型或元素类型的数组类型(§10) 是以上类型之一。
因此,为了将name
和value
组合在一起,它们代表初始化参数,唯一的选择是使用注释(在本例中为@WebInitParam
),并将相应的值设置为其参数
答案 1 :(得分:0)
与大多数关于语言设计选择的问题一样,我们只能在这里推测。我认为有一些原因是:
保持语言简单 它有点冗余,但注释的语法可以重用,不需要新的语言结构。这使得解析和阅读更容易。当然,它更长,但编写注释的名称也更明确。
请勿限制可能的未来语言增强功能 如果注释支持继承,则建议的语法将不起作用。我不知道这是否是一个有计划的功能,但如果可以省略类型,就不可能直截了当地实现。
在许多情况下,无论如何,一系列注释似乎都是一种解决方法。在Java 8中可以避免这种情况,您可以在其中添加多个相同类型的注释:
@WebServlet(urlPatterns="/MyPattern")
@WebInitParam(name="ccc", value="333")
@WebInitParam(name="abc", value="1")
(我不知道servlet api是否真的支持这个)