20

为什么不鼓励间接访问静态成员?在 Eclipse 中,您可以在 Preferences > Java > Compiler > Error/Warnings > "Indirect access to static member" 下启用/禁用此警告。

将“间接访问静态成员”配置为导致警告的示例:

JLabel label = new JLabel();
label.setAlignmentX(JLabel.CENTER_ALIGNMENT);       // causes warning    
label.setAlignmentX(Component.CENTER_ALIGNMENT);    // is ok
4

2 回答 2

19

通过访问Component类的成员JLabel会给人一种错误的印象,即该成员特定于JLabel,实际上它是Component的成员,并且恰好被其所有子类继承。通过声明类访问它不会丢失任何东西,并且肯定有一些清晰的东西。

于 2013-09-18T09:05:06.947 回答
8

除了 Marko Topolnik 所说的之外,还有一个事实是,如果JLabel将来有一个同名的静态成员,仅仅重新编译JLabel.java不会使调用代码知道该模块中存在的常量. 相反,在重新编译代码之前,它仍然会愉快地使用,Component.CENTER_ALIGNMENT尽管源代码相反。

Component后一个引用肯定会引用name的静态成员CENTER_ALIGNMENT,而前者将引用其中一个Component或任何子类中的成员,直到JLabel稍后在其中任何一个中重新定义名称。

在使用静态函数或成员变量的情况下,如果子类的更高版本也声明了一个被覆盖的子类,即使不重新编译,间接访问的含义也会改变。所有这些可能有点假设,但无论如何都值得考虑。

于 2013-09-18T09:20:01.670 回答