为啥我的托管 bean 中不能有静态公共字段?

Posted

技术标签:

【中文标题】为啥我的托管 bean 中不能有静态公共字段?【英文标题】:Why can't I have static public fields in my managed beans?为什么我的托管 bean 中不能有静态公共字段? 【发布时间】:2012-01-06 17:08:12 【问题描述】:

我刚开始使用 Netbeans 7.1 测试版,它发出的错误类型是我以前从未见过的。具体来说:

A managed bean with a public field should not declare any scope other than @Dependent.

它抱怨的字段是public static final。我可以理解对非静态字段的限制,但我想不出一个很好的理由,这对于静态字段是不允许的。不幸的是,我使用了很多,因为我不喜欢在我的代码中使用常量。

我注意到,即使我在编辑器的空白处看到了红点,maven 驱动的构建仍然有效,而且 GlassFish 仍然按我预期的方式运行我的应用程序。

那么我对这个问题的看法是什么?我是否必须将我的静态字段移到其他地方,还是有其他处理方式?

【问题讨论】:

注意:JSF 不禁止这样做。出于某种不清楚的原因,可能是由于某些 CDI 规范限制,是 Netbeans 这样做的。因为它显然是一个测试版,所以我只是向 Netbeans 人报告一个错误。 【参考方案1】:

引用javax.enterprise.injectpackage javadocs:

如果托管 bean 具有公共字段,则它必须具有@Dependent 范围。

但我同意@BalusC,如果编译成功,Netbeans 应该将其报告为警告(是吗?)。

无论如何,这些常量真的是 API 的一部分吗?我的意思是,除了他们自己的课程之外,您是否可以在其他任何地方访问它们?如果没有,请减少对私人的可见性。 (如果您只需要从视图中访问常量,您还可以为私有常量创建访问器)。如果是,我建议您将它们移到其他地方。

【讨论】:

NetBeans 7.1 beta(不是早期版本)在左边距用红点标记类行。但是,该错误不会像其他错误那样扩展到项目窗口。没错,我的许多常量可以指定为私有而不是公共,我可以将可导出的常量重构为 getter(而不是 setter!)。不过,这让我感到意外。当您检查大多数 JSF 需求时,它们会很直观。这个还是不行。 修复了 mutator 部分以供进一步参考,在午夜后喝咖啡的疲惫的开发人员的糟糕情况嘿嘿嘿。无论如何,如果您想为 Netbeans 团队报告错误,here 就可以了。如果它编译并运行良好,则可能是 Netbeans 团队误解了specs(或者规范可能不清楚静态变量,并将其保留为特定于实现的细节......)。以防万一,请阅读规格并准备好进行开放式辩论。 这是来自链接规范的引用:(第 27 页,- 3.1 托管 Beans):If a managed bean with a public field declares any scope other than @Dependent, the container automatically detects the problem and treats it as a definition error. 它没有说明类变量与对象字段,但也许这对 Gavin King 来说是个好问题: D. 可见性可以保护吗?另外,为什么字段不能公开?这使得使用遗留代码变得很痛苦。真的。【参考方案2】:

公共字段(静态或非静态)不可代理 - 这就是为什么它们只能是依赖范围。要解决这个问题,您显然可以通过 getter 方法访问它们。

【讨论】:

以上是关于为啥我的托管 bean 中不能有静态公共字段?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在 TypeScript 类中定义一个 const 字段,为啥静态只读不起作用?

为啥我不能在接口中声明静态方法?

为啥我的类中不能有静态对象? [复制]

为啥express要指定静态资源托管

如何以编程方式将 Java CDI 托管 bean 注入(静态)方法中的局部变量

Scala trait - 是不是有 Java 接口公共静态字段的等价物?